prefect-client 3.8.2.dev5__tar.gz → 3.8.3__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 (452) hide show
  1. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/PKG-INFO +2 -2
  2. prefect_client-3.8.3/src/prefect/_build_info.py +5 -0
  3. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/cancellation.py +12 -9
  4. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/services.py +13 -2
  5. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/observers.py +30 -17
  6. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_work_pools/client.py +2 -2
  7. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/objects.py +1 -1
  8. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/_asyncio.py +26 -0
  9. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/services.py +84 -2
  10. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/context.py +1 -1
  11. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/clients.py +15 -5
  12. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/flows.py +3 -3
  13. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/infrastructure/provisioners/container_instance.py +1 -1
  14. prefect_client-3.8.3/src/prefect/runner/_uv_command.py +90 -0
  15. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_workspace_starter.py +7 -66
  16. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/storage.py +5 -2
  17. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/tasks.py +0 -8
  18. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/process.py +44 -5
  19. prefect_client-3.8.2.dev5/src/prefect/_build_info.py +0 -5
  20. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/.gitignore +0 -0
  21. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/LICENSE +0 -0
  22. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/README.md +0 -0
  23. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/hatch_build.py +0 -0
  24. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/pyproject.toml +0 -0
  25. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/.prefectignore +0 -0
  26. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/AGENTS.md +0 -0
  27. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/__init__.py +0 -0
  28. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/__main__.py +0 -0
  29. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/__init__.py +0 -0
  30. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/_launchers.py +0 -0
  31. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/bundles/__init__.py +0 -0
  32. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/bundles/execute.py +0 -0
  33. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/plugins/__init__.py +0 -0
  34. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/plugins/apply.py +0 -0
  35. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  36. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/plugins/manager.py +0 -0
  37. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/plugins/spec.py +0 -0
  38. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/sla/__init__.py +0 -0
  39. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/sla/client.py +0 -0
  40. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_experimental/sla/objects.py +0 -0
  41. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_flow_run_suspension.py +0 -0
  42. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/__init__.py +0 -0
  43. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/_logging.py +0 -0
  44. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/__init__.py +0 -0
  45. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  46. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/client.py +0 -0
  47. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/device_id.py +0 -0
  48. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/emit.py +0 -0
  49. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/enabled.py +0 -0
  50. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/events.py +0 -0
  51. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/milestones.py +0 -0
  52. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/notice.py +0 -0
  53. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/analytics/service.py +0 -0
  54. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/ast_utils.py +0 -0
  55. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/buildx.py +0 -0
  56. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/compatibility/__init__.py +0 -0
  57. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  58. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/compatibility/backports.py +0 -0
  59. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/compatibility/blocks.py +0 -0
  60. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  61. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  62. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/compatibility/migration.py +0 -0
  63. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/compatibility/starlette.py +0 -0
  64. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/__init__.py +0 -0
  65. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/api.py +0 -0
  66. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/calls.py +0 -0
  67. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  68. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/inspection.py +0 -0
  69. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/primitives.py +0 -0
  70. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/threads.py +0 -0
  71. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/concurrency/waiters.py +0 -0
  72. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/control_listener.py +0 -0
  73. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/deprecated.py +0 -0
  74. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/engine.py +0 -0
  75. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/git.py +0 -0
  76. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  77. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/installation.py +0 -0
  78. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/integrations.py +0 -0
  79. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/launchers.py +0 -0
  80. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/lazy.py +0 -0
  81. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/metrics.py +0 -0
  82. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/observability.py +0 -0
  83. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/plugins/__init__.py +0 -0
  84. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/plugins/apply.py +0 -0
  85. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/plugins/collections.py +0 -0
  86. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  87. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/plugins/manager.py +0 -0
  88. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/plugins/spec.py +0 -0
  89. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/plugins/startup.py +0 -0
  90. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/pydantic/__init__.py +0 -0
  91. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/pydantic/schemas.py +0 -0
  92. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  93. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  94. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  95. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/pytz.py +0 -0
  96. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/result_records.py +0 -0
  97. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/retries.py +0 -0
  98. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/schema.py +0 -0
  99. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/schemas/__init__.py +0 -0
  100. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/schemas/_registry.py +0 -0
  101. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/schemas/bases.py +0 -0
  102. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/schemas/fields.py +0 -0
  103. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/schemas/serializers.py +0 -0
  104. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/schemas/validators.py +0 -0
  105. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  106. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/states.py +0 -0
  107. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/testing.py +0 -0
  108. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/urls.py +0 -0
  109. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/uuid7.py +0 -0
  110. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/version_checking.py +0 -0
  111. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/versioning.py +0 -0
  112. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/waiters.py +0 -0
  113. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_internal/websockets.py +0 -0
  114. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/__init__.py +0 -0
  115. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/fetcher.py +0 -0
  116. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/generator.py +0 -0
  117. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/models.py +0 -0
  118. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/naming.py +0 -0
  119. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/renderer.py +0 -0
  120. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/schema_converter.py +0 -0
  121. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/templates/__init__.py +0 -0
  122. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  123. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/types.py +0 -0
  124. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_sdk/unions.py +0 -0
  125. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_vendor/croniter/__init__.py +0 -0
  126. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/_vendor/croniter/croniter.py +0 -0
  127. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/agent.py +0 -0
  128. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/analytics/__init__.py +0 -0
  129. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/artifacts.py +0 -0
  130. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/assets/__init__.py +0 -0
  131. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/assets/core.py +0 -0
  132. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/assets/materialize.py +0 -0
  133. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/automations.py +0 -0
  134. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/AGENTS.md +0 -0
  135. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/__init__.py +0 -0
  136. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/abstract.py +0 -0
  137. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/core.py +0 -0
  138. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/fields.py +0 -0
  139. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/notifications.py +0 -0
  140. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/redis.py +0 -0
  141. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/system.py +0 -0
  142. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/blocks/webhook.py +0 -0
  143. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/bundles/__init__.py +0 -0
  144. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/bundles/_file_collector.py +0 -0
  145. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/bundles/_ignore_filter.py +0 -0
  146. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/bundles/_path_resolver.py +0 -0
  147. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/bundles/_zip_builder.py +0 -0
  148. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/bundles/_zip_extractor.py +0 -0
  149. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/bundles/execute.py +0 -0
  150. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/cache_policies.py +0 -0
  151. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/AGENTS.md +0 -0
  152. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/__init__.py +0 -0
  153. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/attribution.py +0 -0
  154. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/base.py +0 -0
  155. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/cloud.py +0 -0
  156. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/collections.py +0 -0
  157. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/constants.py +0 -0
  158. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/__init__.py +0 -0
  159. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  160. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  161. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  162. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_automations/client.py +0 -0
  163. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  164. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  165. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  166. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  167. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  168. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  169. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  170. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  171. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  172. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  173. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  174. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_events/client.py +0 -0
  175. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  176. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  177. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  178. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_flows/client.py +0 -0
  179. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  180. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_logs/client.py +0 -0
  181. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  182. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_variables/client.py +0 -0
  183. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  184. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/base.py +0 -0
  185. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/orchestration/routes.py +0 -0
  186. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/__init__.py +0 -0
  187. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/actions.py +0 -0
  188. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/events.py +0 -0
  189. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/filters.py +0 -0
  190. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/responses.py +0 -0
  191. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/schedules.py +0 -0
  192. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/sorting.py +0 -0
  193. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/schemas/worker_channel.py +0 -0
  194. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/subscriptions.py +0 -0
  195. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/types/__init__.py +0 -0
  196. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  197. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/client/utilities.py +0 -0
  198. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/AGENTS.md +0 -0
  199. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/__init__.py +0 -0
  200. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/_events.py +0 -0
  201. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/_leases.py +0 -0
  202. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/_sync.py +0 -0
  203. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/asyncio.py +0 -0
  204. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/context.py +0 -0
  205. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/sync.py +0 -0
  206. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/v1/__init__.py +0 -0
  207. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  208. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/v1/_events.py +0 -0
  209. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/v1/asyncio.py +0 -0
  210. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/v1/context.py +0 -0
  211. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/v1/services.py +0 -0
  212. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/concurrency/v1/sync.py +0 -0
  213. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/AGENTS.md +0 -0
  214. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/__init__.py +0 -0
  215. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/base.py +0 -0
  216. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/deployments.py +0 -0
  217. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/flow_runs.py +0 -0
  218. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/runner.py +0 -0
  219. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/schedules.py +0 -0
  220. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/steps/__init__.py +0 -0
  221. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/steps/core.py +0 -0
  222. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/steps/pull.py +0 -0
  223. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/deployments/steps/utility.py +0 -0
  224. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/docker/__init__.py +0 -0
  225. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/docker/_buildx.py +0 -0
  226. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/docker/docker_image.py +0 -0
  227. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/engine.py +0 -0
  228. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/AGENTS.md +0 -0
  229. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/__init__.py +0 -0
  230. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/actions.py +0 -0
  231. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/filters.py +0 -0
  232. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/related.py +0 -0
  233. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/schemas/__init__.py +0 -0
  234. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/schemas/automations.py +0 -0
  235. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  236. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/schemas/events.py +0 -0
  237. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/schemas/labelling.py +0 -0
  238. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/subscribers.py +0 -0
  239. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/utilities.py +0 -0
  240. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/events/worker.py +0 -0
  241. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/exceptions.py +0 -0
  242. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/filesystems.py +0 -0
  243. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/flow_engine.py +0 -0
  244. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/flow_runs.py +0 -0
  245. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/futures.py +0 -0
  246. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/infrastructure/__init__.py +0 -0
  247. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/infrastructure/base.py +0 -0
  248. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  249. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  250. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  251. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  252. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  253. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/input/__init__.py +0 -0
  254. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/input/actions.py +0 -0
  255. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/input/run_input.py +0 -0
  256. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/locking/__init__.py +0 -0
  257. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/locking/_filelock.py +0 -0
  258. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/locking/filesystem.py +0 -0
  259. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/locking/memory.py +0 -0
  260. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/locking/protocol.py +0 -0
  261. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/AGENTS.md +0 -0
  262. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/__init__.py +0 -0
  263. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/clients.py +0 -0
  264. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/configuration.py +0 -0
  265. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/filters.py +0 -0
  266. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/formatters.py +0 -0
  267. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/handlers.py +0 -0
  268. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/highlighters.py +0 -0
  269. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/loggers.py +0 -0
  270. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/logging/logging.yml +0 -0
  271. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/main.py +0 -0
  272. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/plugins.py +0 -0
  273. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/py.typed +0 -0
  274. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/results.py +0 -0
  275. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/AGENTS.md +0 -0
  276. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/__init__.py +0 -0
  277. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_cancel_finalizer.py +0 -0
  278. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_cancellation_manager.py +0 -0
  279. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_control_channel.py +0 -0
  280. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_deployment_registry.py +0 -0
  281. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_event_emitter.py +0 -0
  282. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_flow_resolver.py +0 -0
  283. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_flow_run_executor.py +0 -0
  284. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_hook_runner.py +0 -0
  285. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_limit_manager.py +0 -0
  286. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_process_manager.py +0 -0
  287. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  288. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_starter_bundle.py +0 -0
  289. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_starter_direct.py +0 -0
  290. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_starter_engine.py +0 -0
  291. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_state_proposer.py +0 -0
  292. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/_workspace_resolver.py +0 -0
  293. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/runner.py +0 -0
  294. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runner/server.py +0 -0
  295. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runtime/__init__.py +0 -0
  296. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runtime/deployment.py +0 -0
  297. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runtime/flow_run.py +0 -0
  298. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/runtime/task_run.py +0 -0
  299. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/schedules.py +0 -0
  300. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/serializers.py +0 -0
  301. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/__init__.py +0 -0
  302. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/_ui_static.py +0 -0
  303. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/admin.py +0 -0
  304. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/artifacts.py +0 -0
  305. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/automations.py +0 -0
  306. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/background_workers.py +0 -0
  307. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/block_capabilities.py +0 -0
  308. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/block_documents.py +0 -0
  309. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/block_schemas.py +0 -0
  310. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/block_types.py +0 -0
  311. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/clients.py +0 -0
  312. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/collections.py +0 -0
  313. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  314. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/concurrency_limits.py +0 -0
  315. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  316. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/csrf_token.py +0 -0
  317. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/dependencies.py +0 -0
  318. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/deployments.py +0 -0
  319. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/events.py +0 -0
  320. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/flow_run_states.py +0 -0
  321. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/flow_runs.py +0 -0
  322. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/flows.py +0 -0
  323. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/logs.py +0 -0
  324. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/middleware.py +0 -0
  325. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/root.py +0 -0
  326. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/run_history.py +0 -0
  327. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/saved_searches.py +0 -0
  328. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/server.py +0 -0
  329. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  330. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/task_run_states.py +0 -0
  331. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/task_runs.py +0 -0
  332. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/task_workers.py +0 -0
  333. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/templates.py +0 -0
  334. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/ui/__init__.py +0 -0
  335. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/ui/flow_runs.py +0 -0
  336. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/ui/flows.py +0 -0
  337. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/ui/schemas.py +0 -0
  338. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/ui/task_runs.py +0 -0
  339. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/validation.py +0 -0
  340. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/variables.py +0 -0
  341. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/work_queues.py +0 -0
  342. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/server/api/workers.py +0 -0
  343. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/AGENTS.md +0 -0
  344. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/__init__.py +0 -0
  345. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/_types.py +0 -0
  346. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/base.py +0 -0
  347. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/constants.py +0 -0
  348. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/context.py +0 -0
  349. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/legacy.py +0 -0
  350. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/__init__.py +0 -0
  351. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/_defaults.py +0 -0
  352. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/api.py +0 -0
  353. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/cli.py +0 -0
  354. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/client.py +0 -0
  355. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/cloud.py +0 -0
  356. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/deployments.py +0 -0
  357. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/events.py +0 -0
  358. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/experiments.py +0 -0
  359. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/flows.py +0 -0
  360. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/internal.py +0 -0
  361. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/logging.py +0 -0
  362. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/plugins.py +0 -0
  363. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/results.py +0 -0
  364. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/root.py +0 -0
  365. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/runner.py +0 -0
  366. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/__init__.py +0 -0
  367. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/api.py +0 -0
  368. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/concurrency.py +0 -0
  369. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/database.py +0 -0
  370. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/deployments.py +0 -0
  371. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/docket.py +0 -0
  372. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/ephemeral.py +0 -0
  373. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/events.py +0 -0
  374. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  375. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/logs.py +0 -0
  376. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/root.py +0 -0
  377. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/services.py +0 -0
  378. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/tasks.py +0 -0
  379. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/ui.py +0 -0
  380. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/server/worker_channel.py +0 -0
  381. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/tasks.py +0 -0
  382. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/telemetry.py +0 -0
  383. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/testing.py +0 -0
  384. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/models/worker.py +0 -0
  385. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/profiles.py +0 -0
  386. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/profiles.toml +0 -0
  387. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/settings/sources.py +0 -0
  388. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/states.py +0 -0
  389. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/task_engine.py +0 -0
  390. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/task_runners.py +0 -0
  391. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/task_runs.py +0 -0
  392. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/task_worker.py +0 -0
  393. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/telemetry/__init__.py +0 -0
  394. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/telemetry/run_telemetry.py +0 -0
  395. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/transactions.py +0 -0
  396. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/types/__init__.py +0 -0
  397. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/types/_concurrency.py +0 -0
  398. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/types/_datetime.py +0 -0
  399. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/types/entrypoint.py +0 -0
  400. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/types/names.py +0 -0
  401. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/AGENTS.md +0 -0
  402. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/__init__.py +0 -0
  403. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/annotations.py +0 -0
  404. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  405. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  406. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/callables/AGENTS.md +0 -0
  407. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/callables/__init__.py +0 -0
  408. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/collections.py +0 -0
  409. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/compat.py +0 -0
  410. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/context.py +0 -0
  411. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/dispatch.py +0 -0
  412. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/dockerutils.py +0 -0
  413. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/engine/AGENTS.md +0 -0
  414. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/engine/__init__.py +0 -0
  415. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  416. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/filesystem/__init__.py +0 -0
  417. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/generics.py +0 -0
  418. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/hashing.py +0 -0
  419. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/importtools.py +0 -0
  420. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/math.py +0 -0
  421. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/names.py +0 -0
  422. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  423. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/processutils/__init__.py +0 -0
  424. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/pydantic.py +0 -0
  425. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/render_swagger.py +0 -0
  426. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  427. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  428. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  429. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/schema_tools/validation.py +0 -0
  430. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/services.py +0 -0
  431. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/slugify.py +0 -0
  432. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/templating/AGENTS.md +0 -0
  433. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/templating/__init__.py +0 -0
  434. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/text.py +0 -0
  435. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/timeout.py +0 -0
  436. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/urls.py +0 -0
  437. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/utilities/visualization.py +0 -0
  438. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/variables.py +0 -0
  439. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/AGENTS.md +0 -0
  440. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/__init__.py +0 -0
  441. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/_cleanup.py +0 -0
  442. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/_cleanup_handlers.py +0 -0
  443. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  444. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  445. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/_worker_channel/_state.py +0 -0
  446. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  447. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  448. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/base.py +0 -0
  449. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/block.py +0 -0
  450. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/cloud.py +0 -0
  451. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/server.py +0 -0
  452. {prefect_client-3.8.2.dev5 → prefect_client-3.8.3}/src/prefect/workers/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: prefect-client
3
- Version: 3.8.2.dev5
3
+ Version: 3.8.3
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.8.3"
3
+ __build_date__ = "2026-08-13 18:54:04.527529+00:00"
4
+ __git_commit__ = "d8f54b5c4857e933c31aac97e8ef56ea732c5138"
5
+ __dirty__ = False
@@ -424,11 +424,18 @@ class WatcherThreadCancelScope(CancelScope):
424
424
  return self
425
425
 
426
426
  def __exit__(self, *_: Any) -> Optional[bool]:
427
- retval = super().__exit__(*_)
428
- self._event.set()
429
- if self._enforcer_thread:
430
- logger.debug("%r joining enforcer thread %r", self, self._enforcer_thread)
431
- self._enforcer_thread.join()
427
+ # The enforcer thread can inject a cancellation exception at any instruction in
428
+ # this frame, so the event must be set from a `finally` to guarantee the
429
+ # enforcer is always released.
430
+ try:
431
+ retval = super().__exit__(*_)
432
+ finally:
433
+ self._event.set()
434
+ if self._enforcer_thread:
435
+ logger.debug(
436
+ "%r joining enforcer thread %r", self, self._enforcer_thread
437
+ )
438
+ self._enforcer_thread.join()
432
439
  return retval
433
440
 
434
441
  def _send_cancelled_error(self):
@@ -458,10 +465,6 @@ class WatcherThreadCancelScope(CancelScope):
458
465
  with _get_thread_shield(self._supervised_thread):
459
466
  self._send_cancelled_error()
460
467
 
461
- # Wait for the supervised thread to exit its context
462
- logger.debug("%r waiting for supervised thread to exit", self)
463
- self._event.wait()
464
-
465
468
  def cancel(self, throw: bool = True):
466
469
  if not super().cancel():
467
470
  return 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:
@@ -24,8 +24,9 @@ from prefect.exceptions import ObjectNotFound
24
24
  from prefect.logging.loggers import get_logger
25
25
  from prefect.utilities.services import critical_service_loop
26
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.
27
+ # How long to wait before warning that a suspension transition is still not
28
+ # visible on the flow run, how often to look initially, and the retry cap after
29
+ # the warning.
29
30
  SUSPENSION_CONFIRMATION_WARNING_AFTER = 30.0
30
31
  SUSPENSION_CONFIRMATION_INTERVAL = 0.5
31
32
  SUSPENSION_CONFIRMATION_MAX_INTERVAL = 10.0
@@ -113,28 +114,40 @@ class _SuspensionWatch:
113
114
 
114
115
  while not self._closed and not self.is_suspended:
115
116
  try:
116
- state = await self._client.read_flow_run_state(state_id)
117
+ flow_run = await self._client.read_flow_run(self.flow_run_id)
117
118
  except ObjectNotFound:
118
- pass
119
+ self._logger.debug(
120
+ "Flow run %s no longer exists; abandoning suspension confirmation.",
121
+ self.flow_run_id,
122
+ )
123
+ return
119
124
  except Exception as exc:
120
125
  last_error = exc
121
126
  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
127
+ state = flow_run.state
128
+ if state is not None:
129
+ if state.id == state_id or is_suspended_flow_run_state(state):
130
+ self.notify_if_suspended(state)
131
+ return
132
+ if state.timestamp >= occurred:
133
+ # Superseded (e.g. resumed) before confirmation: still
134
+ # stop, or this engine could double-execute alongside
135
+ # the resumed run's fresh submission.
136
+ self.notify_if_suspended(
137
+ State(
138
+ id=state_id,
139
+ type=StateType.PAUSED,
140
+ name="Suspended",
141
+ timestamp=occurred,
142
+ )
143
+ )
144
+ return
133
145
 
134
146
  if not warned and time.monotonic() >= warning_deadline:
135
147
  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.",
148
+ "Received a suspension event for flow run %s, but its state %s"
149
+ " has not become visible within %s seconds; continuing to"
150
+ " retry.",
138
151
  self.flow_run_id,
139
152
  state_id,
140
153
  SUSPENSION_CONFIRMATION_WARNING_AFTER,
@@ -48,7 +48,7 @@ class WorkPoolClient(BaseClient):
48
48
  Args:
49
49
  work_pool_name: The name of the work pool to heartbeat against.
50
50
  worker_name: The name of the worker sending the heartbeat.
51
- return_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `return_id` is `True`.
51
+ get_worker_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `get_worker_id` is `True`.
52
52
  worker_metadata: Metadata about the worker to send to the server.
53
53
  """
54
54
  from uuid import UUID
@@ -376,7 +376,7 @@ class WorkPoolAsyncClient(BaseAsyncClient):
376
376
  Args:
377
377
  work_pool_name: The name of the work pool to heartbeat against.
378
378
  worker_name: The name of the worker sending the heartbeat.
379
- return_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `return_id` is `True`.
379
+ get_worker_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `get_worker_id` is `True`.
380
380
  worker_metadata: Metadata about the worker to send to the server.
381
381
  """
382
382
  from uuid import UUID
@@ -1477,7 +1477,7 @@ class WorkQueueHealthPolicy(PrefectBaseModel):
1477
1477
  Given empirical information about the state of the work queue, evaluate its health status.
1478
1478
 
1479
1479
  Args:
1480
- late_runs: the count of late runs for the work queue.
1480
+ late_runs_count: the count of late runs for the work queue.
1481
1481
  last_polled: the last time the work queue was polled, if available.
1482
1482
 
1483
1483
  Returns:
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import concurrent.futures
4
5
  import logging
5
6
  from contextlib import asynccontextmanager
6
7
  from typing import TYPE_CHECKING, AsyncGenerator, Literal, Optional
@@ -150,6 +151,9 @@ async def aacquire_concurrency_slots_with_lease(
150
151
  )
151
152
  try:
152
153
  response = await asyncio.wrap_future(future)
154
+ except asyncio.CancelledError:
155
+ _release_lease_when_granted(service, future)
156
+ raise
153
157
  except TimeoutError as timeout:
154
158
  raise AcquireConcurrencySlotTimeoutError(
155
159
  f"Attempt to acquire concurrency slots timed out after {timeout_seconds} second(s)"
@@ -225,6 +229,28 @@ def _discard_cleanup_lease(lease_id: UUID) -> None:
225
229
  ctx.cleanup_lease_ids.remove(lease_id)
226
230
 
227
231
 
232
+ def _release_lease_when_granted(
233
+ service: ConcurrencySlotAcquisitionWithLeaseService,
234
+ future: "concurrent.futures.Future[httpx.Response]",
235
+ ) -> None:
236
+ """Release the lease for an acquisition whose caller has been cancelled.
237
+
238
+ The acquisition may still be granted after the caller is gone, and the lease
239
+ id never reaches the `ConcurrencyContext`, so the slots would stay occupied
240
+ until the lease expires. The cancelled caller cannot do the release itself, so
241
+ the service that acquired the slots is asked to release them.
242
+ """
243
+
244
+ def _release(completed: "concurrent.futures.Future[httpx.Response]") -> None:
245
+ if completed.cancelled() or completed.exception() is not None:
246
+ # Nothing was granted, so there is nothing to release.
247
+ return
248
+
249
+ service.release_orphaned_lease(completed.result())
250
+
251
+ future.add_done_callback(_release)
252
+
253
+
228
254
  def _response_to_minimal_concurrency_limit_response(
229
255
  response: httpx.Response,
230
256
  ) -> list[MinimalConcurrencyLimitResponse]:
@@ -1,10 +1,11 @@
1
1
  import asyncio
2
+ import concurrent.futures
2
3
  import json
3
4
  from collections.abc import AsyncGenerator
4
5
  from contextlib import asynccontextmanager
5
6
  from threading import Lock
6
7
  from typing import TYPE_CHECKING, Literal, Optional
7
- from uuid import uuid4
8
+ from uuid import UUID, uuid4
8
9
 
9
10
  import cachetools
10
11
  import httpx
@@ -104,12 +105,25 @@ class ConcurrencySlotAcquisitionWithLeaseService(
104
105
  super().__init__(concurrency_limit_names)
105
106
  self._client: PrefectClient
106
107
  self.concurrency_limit_names: list[str] = sorted(list(concurrency_limit_names))
108
+ self._pending_releases: set[concurrent.futures.Future[None]] = set()
107
109
 
108
110
  @asynccontextmanager
109
111
  async def _lifespan(self) -> AsyncGenerator[None, None]:
110
112
  async with get_client() as client:
111
113
  self._client = client
112
- yield
114
+ try:
115
+ yield
116
+ finally:
117
+ # The client closes when this exits, so releases scheduled by
118
+ # cancelled callers have to finish first or their slots leak.
119
+ if self._pending_releases:
120
+ await asyncio.gather(
121
+ *(
122
+ asyncio.wrap_future(release)
123
+ for release in tuple(self._pending_releases)
124
+ ),
125
+ return_exceptions=True,
126
+ )
113
127
 
114
128
  async def acquire(
115
129
  self,
@@ -185,6 +199,74 @@ class ConcurrencySlotAcquisitionWithLeaseService(
185
199
  if max_retries is not None:
186
200
  max_retries -= 1
187
201
 
202
+ async def _discard(self, response: httpx.Response) -> None:
203
+ """Release a lease granted to a caller that was cancelled while waiting.
204
+
205
+ Without this the slots stay occupied until the lease expires, because the
206
+ caller never learns the lease id and so cannot record it for cleanup.
207
+ """
208
+ lease_id = self._lease_id_from_response(response)
209
+ if lease_id is None:
210
+ return
211
+
212
+ try:
213
+ await self._client.release_concurrency_slots_with_lease(lease_id=lease_id)
214
+ except Exception:
215
+ logger.warning(
216
+ f"Failed to release concurrency lease {lease_id} for "
217
+ f"{self.concurrency_limit_names} after the acquiring caller was cancelled",
218
+ exc_info=True,
219
+ )
220
+
221
+ def release_orphaned_lease(
222
+ self, response: httpx.Response
223
+ ) -> "concurrent.futures.Future[None]":
224
+ """Release a lease that was delivered to a caller which is already gone.
225
+
226
+ The release is scheduled on the service's own loop so it reuses the client
227
+ that acquired the slots, keeping acquisition and cleanup on the same API, and
228
+ is tracked so that draining the service waits for it.
229
+ """
230
+ with self._lock:
231
+ loop = self._loop
232
+ if self._stopped or loop is None or loop.is_closed():
233
+ logger.warning(
234
+ f"Unable to release concurrency lease for {self.concurrency_limit_names} "
235
+ "after the acquiring caller was cancelled: the acquisition service is "
236
+ "no longer running. The slots remain occupied until the lease expires."
237
+ )
238
+ stopped: concurrent.futures.Future[None] = concurrent.futures.Future()
239
+ stopped.set_result(None)
240
+ return stopped
241
+
242
+ # Registering under the lock `_stop` uses keeps the service from
243
+ # finishing its lifespan, and closing its client, before this release.
244
+ release = asyncio.run_coroutine_threadsafe(self._discard(response), loop)
245
+ self._pending_releases.add(release)
246
+
247
+ release.add_done_callback(self._pending_releases.discard)
248
+ return release
249
+
250
+ def _lease_id_from_response(self, response: httpx.Response) -> Optional[UUID]:
251
+ """Read the lease id out of a successful acquisition response.
252
+
253
+ Returns `None` when no slots were acquired, and logs when the response is
254
+ malformed, since that leaves a possibly active lease we cannot release.
255
+ """
256
+ try:
257
+ data = response.json()
258
+ if not data.get("limits"):
259
+ return None
260
+ return UUID(data["lease_id"])
261
+ except Exception:
262
+ logger.warning(
263
+ f"Unable to read the lease id from the acquisition response for "
264
+ f"{self.concurrency_limit_names}; if a lease was granted its slots "
265
+ "remain occupied until it expires.",
266
+ exc_info=True,
267
+ )
268
+ return None
269
+
188
270
 
189
271
  def _should_use_cache(
190
272
  names: list[str], holder: Optional["ConcurrencyLeaseHolder"]
@@ -994,7 +994,7 @@ def use_profile(
994
994
 
995
995
  Args:
996
996
  profile: The name of the profile to load or an instance of a Profile.
997
- override_environment_variable: If set, variables in the profile will take
997
+ override_environment_variables: If set, variables in the profile will take
998
998
  precedence over current environment variables. By default, environment
999
999
  variables will override profile settings.
1000
1000
  include_current_context: If set, the new settings will be constructed
@@ -1,5 +1,6 @@
1
1
  import abc
2
2
  import asyncio
3
+ import base64
3
4
  from datetime import timedelta
4
5
  from types import TracebackType
5
6
  from typing import (
@@ -252,6 +253,11 @@ class AssertingEventsClient(EventsClient):
252
253
  return self
253
254
 
254
255
 
256
+ def _basic_auth_token(auth_string: str) -> str:
257
+ """Encode an auth string of the form 'user:password' for basic authentication"""
258
+ return base64.b64encode(auth_string.encode("utf-8")).decode("utf-8")
259
+
260
+
255
261
  def _get_api_url_and_key(
256
262
  api_url: Optional[str], api_key: Optional[str]
257
263
  ) -> Tuple[str, str]:
@@ -303,10 +309,15 @@ class PrefectEventsClient(EventsClient):
303
309
  auth_string.get_secret_value() if auth_string is not None else None
304
310
  )
305
311
  self._events_socket_url = events_in_socket_from_api_url(api_url)
306
- self._connect = websocket_connect(
307
- self._events_socket_url,
308
- subprotocols=[Subprotocol("prefect")],
309
- )
312
+ connect_kwargs: Dict[str, Any] = {"subprotocols": [Subprotocol("prefect")]}
313
+ if self._auth_token:
314
+ # Servers and proxies that require basic authentication reject the
315
+ # HTTP upgrade request before the "prefect" subprotocol auth
316
+ # handshake can run, so also send the credentials as a header.
317
+ connect_kwargs["additional_headers"] = {
318
+ "Authorization": f"Basic {_basic_auth_token(self._auth_token)}"
319
+ }
320
+ self._connect = websocket_connect(self._events_socket_url, **connect_kwargs)
310
321
  self._websocket = None
311
322
  self._reconnection_attempts = reconnection_attempts
312
323
  self._unconfirmed_events = []
@@ -718,7 +729,6 @@ class PrefectEventSubscriber:
718
729
  """
719
730
  Args:
720
731
  api_url: The base URL for a Prefect Cloud workspace
721
- api_key: The API of an actor with the manage_events scope
722
732
  reconnection_attempts: When the client is disconnected, how many times
723
733
  the client should attempt to reconnect
724
734
  reconnect_on_clean_close: Whether to reconnect when the server closes
@@ -1507,7 +1507,7 @@ class Flow(Generic[P, R]):
1507
1507
  parameter schema for the created deployment.
1508
1508
  entrypoint_type: Type of entrypoint to use for the deployment. When using a module path
1509
1509
  entrypoint, ensure that the module will be importable in the execution environment.
1510
- print_next_steps_message: Whether or not to print a message with next steps
1510
+ print_next_steps: Whether or not to print a message with next steps
1511
1511
  after deploying the deployments.
1512
1512
  ignore_warnings: Whether or not to ignore warnings about the work pool type.
1513
1513
  _sla: (Experimental) SLA configuration for the deployment. May be removed or modified at any time. Currently only supported on Prefect Cloud.
@@ -1705,7 +1705,7 @@ class Flow(Generic[P, R]):
1705
1705
  parameter schema for the created deployment.
1706
1706
  entrypoint_type: Type of entrypoint to use for the deployment. When using a module path
1707
1707
  entrypoint, ensure that the module will be importable in the execution environment.
1708
- print_next_steps_message: Whether or not to print a message with next steps
1708
+ print_next_steps: Whether or not to print a message with next steps
1709
1709
  after deploying the deployments.
1710
1710
  ignore_warnings: Whether or not to ignore warnings about the work pool type.
1711
1711
  _sla: (Experimental) SLA configuration for the deployment. May be removed or modified at any time. Currently only supported on Prefect Cloud.
@@ -2562,7 +2562,6 @@ class InfrastructureBoundFlow(Flow[P, R]):
2562
2562
 
2563
2563
  Args:
2564
2564
  flow_run: The existing flow run to retry
2565
- return_state: If True, return the final state instead of the result
2566
2565
 
2567
2566
  Returns:
2568
2567
  The flow result or final state
@@ -3135,6 +3134,7 @@ async def aserve(
3135
3134
 
3136
3135
  if __name__ == "__main__":
3137
3136
  asyncio.run(main())
3137
+ ```
3138
3138
  """
3139
3139
 
3140
3140
  from prefect.runner import Runner
@@ -592,7 +592,7 @@ class ContainerInstancePushProvisioner:
592
592
  Logs into the given Azure Container Registry.
593
593
 
594
594
  Args:
595
- registry_name: The name of the registry to log into.
595
+ login_server: The login server of the registry to log into.
596
596
 
597
597
  Raises:
598
598
  subprocess.CalledProcessError: If the Azure CLI command execution fails.
@@ -0,0 +1,90 @@
1
+ """Auto-`uv run` launcher command construction shared by runner and worker paths."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import shutil
6
+ from pathlib import Path
7
+ from typing import Iterable
8
+
9
+ from packaging.requirements import InvalidRequirement, Requirement
10
+ from packaging.utils import canonicalize_name
11
+
12
+ from prefect._internal.compatibility.backports import tomllib
13
+ from prefect.settings import get_current_settings
14
+ from prefect.utilities.processutils import command_to_string
15
+
16
+
17
+ def _dependencies_include_prefect(dependencies: object) -> bool:
18
+ if not isinstance(dependencies, Iterable) or isinstance(dependencies, (str, bytes)):
19
+ return False
20
+
21
+ for dependency in dependencies:
22
+ if not isinstance(dependency, str):
23
+ continue
24
+ try:
25
+ name = Requirement(dependency).name
26
+ except InvalidRequirement:
27
+ continue
28
+ if canonicalize_name(name) == "prefect":
29
+ return True
30
+ return False
31
+
32
+
33
+ def _pyproject_declares_prefect_dependency(pyproject: Path) -> bool:
34
+ try:
35
+ data = tomllib.loads(pyproject.read_text(encoding="utf-8"))
36
+ except (OSError, tomllib.TOMLDecodeError):
37
+ return False
38
+
39
+ project = data.get("project")
40
+ if not isinstance(project, dict):
41
+ return False
42
+
43
+ return _dependencies_include_prefect(project.get("dependencies"))
44
+
45
+
46
+ def uv_project_command(
47
+ project_root: Path | None,
48
+ engine_args: Iterable[str],
49
+ path: str | None = None,
50
+ auto_install_dependencies: bool | None = None,
51
+ ) -> str | None:
52
+ """Build an auto-`uv run` command for a project directory, if applicable.
53
+
54
+ Returns `None` unless dependency auto-installation is enabled, `project_root`
55
+ contains a `pyproject.toml` declaring `prefect` as a project dependency, and
56
+ `uv` is discoverable on `path` (or the current `PATH` when `path` is `None`).
57
+
58
+ `auto_install_dependencies` overrides the current setting value, for callers
59
+ that resolve the setting from a run-specific environment.
60
+ """
61
+ if auto_install_dependencies is None:
62
+ auto_install_dependencies = (
63
+ get_current_settings().runner.auto_install_dependencies
64
+ )
65
+ if not auto_install_dependencies:
66
+ return None
67
+
68
+ if project_root is None:
69
+ return None
70
+
71
+ pyproject = project_root / "pyproject.toml"
72
+ if not pyproject.is_file() or not _pyproject_declares_prefect_dependency(pyproject):
73
+ return None
74
+
75
+ uv_executable = (
76
+ shutil.which("uv", path=path) if path is not None else shutil.which("uv")
77
+ )
78
+ if uv_executable is None:
79
+ return None
80
+
81
+ return command_to_string(
82
+ [
83
+ uv_executable,
84
+ "run",
85
+ "--no-default-groups",
86
+ "--project",
87
+ str(project_root),
88
+ *engine_args,
89
+ ]
90
+ )
@@ -2,26 +2,23 @@ from __future__ import annotations
2
2
 
3
3
  import functools
4
4
  import os
5
- import shutil
6
5
  import site
7
6
  import subprocess
8
7
  import sys
9
8
  import sysconfig
10
9
  from contextlib import contextmanager
11
10
  from pathlib import Path
12
- from typing import TYPE_CHECKING, Any, Iterable, Iterator
11
+ from typing import TYPE_CHECKING, Any, Iterator
13
12
  from uuid import UUID
14
13
 
15
14
  import anyio
16
15
  import anyio.abc
17
- from packaging.requirements import InvalidRequirement, Requirement
18
- from packaging.utils import canonicalize_name
19
16
 
20
- from prefect._internal.compatibility.backports import tomllib
21
17
  from prefect.exceptions import MissingFlowError
22
18
  from prefect.flows import load_flow_from_entrypoint, load_function_and_convert_to_flow
23
19
  from prefect.runner._process_manager import ProcessHandle
24
20
  from prefect.runner._starter_engine import EngineCommandStarter
21
+ from prefect.runner._uv_command import uv_project_command
25
22
  from prefect.runner._workspace_resolver import (
26
23
  PreparedWorkspace,
27
24
  PreparedWorkspaceResult,
@@ -29,7 +26,7 @@ from prefect.runner._workspace_resolver import (
29
26
  )
30
27
  from prefect.settings import get_current_settings
31
28
  from prefect.utilities.asyncutils import run_sync_in_worker_thread
32
- from prefect.utilities.processutils import command_to_string, sanitize_subprocess_env
29
+ from prefect.utilities.processutils import sanitize_subprocess_env
33
30
 
34
31
  if TYPE_CHECKING:
35
32
  from prefect.client.schemas.objects import FlowRun
@@ -217,67 +214,11 @@ def _absolute_file_entrypoint(workspace: PreparedWorkspace) -> str:
217
214
  return f"{entrypoint_path.resolve()}:{object_name}"
218
215
 
219
216
 
220
- def _dependencies_include_prefect(dependencies: object) -> bool:
221
- if not isinstance(dependencies, Iterable) or isinstance(dependencies, (str, bytes)):
222
- return False
223
-
224
- for dependency in dependencies:
225
- if not isinstance(dependency, str):
226
- continue
227
- try:
228
- name = Requirement(dependency).name
229
- except InvalidRequirement:
230
- continue
231
- if canonicalize_name(name) == "prefect":
232
- return True
233
- return False
234
-
235
-
236
- def _pyproject_declares_prefect_dependency(pyproject: Path) -> bool:
237
- try:
238
- data = tomllib.loads(pyproject.read_text(encoding="utf-8"))
239
- except (OSError, tomllib.TOMLDecodeError):
240
- return False
241
-
242
- project = data.get("project")
243
- if not isinstance(project, dict):
244
- return False
245
-
246
- return _dependencies_include_prefect(project.get("dependencies"))
247
-
248
-
249
217
  def _uv_run_command(workspace: PreparedWorkspace) -> str | None:
250
- if not get_current_settings().runner.auto_install_dependencies:
251
- return None
252
-
253
- project_root = workspace.project_root
254
- if project_root is None:
255
- return None
256
-
257
- pyproject = project_root / "pyproject.toml"
258
- if not pyproject.is_file() or not _pyproject_declares_prefect_dependency(pyproject):
259
- return None
260
-
261
- workspace_path = workspace.environment.get("PATH")
262
- uv_executable = (
263
- shutil.which("uv", path=workspace_path)
264
- if workspace_path is not None
265
- else shutil.which("uv")
266
- )
267
- if uv_executable is None:
268
- return None
269
-
270
- return command_to_string(
271
- [
272
- uv_executable,
273
- "run",
274
- "--no-default-groups",
275
- "--project",
276
- str(project_root),
277
- "-m",
278
- "prefect.flow_engine",
279
- workspace.runtime_entrypoint,
280
- ]
218
+ return uv_project_command(
219
+ workspace.project_root,
220
+ ["-m", "prefect.flow_engine", workspace.runtime_entrypoint],
221
+ path=workspace.environment.get("PATH"),
281
222
  )
282
223
 
283
224
 
@@ -217,6 +217,9 @@ class GitRepository:
217
217
  "Cannot provide both a branch and a commit SHA. Please provide only one."
218
218
  )
219
219
 
220
+ if branch and branch.startswith("-"):
221
+ raise ValueError("Branch names cannot start with '-'.")
222
+
220
223
  if commit_sha and not re.match(r"^[0-9a-fA-F]{4,64}$", commit_sha):
221
224
  raise ValueError(
222
225
  f"Invalid commit SHA: {commit_sha!r}."
@@ -931,7 +934,7 @@ class LocalStorage:
931
934
  """
932
935
  Sets the working directory in the local filesystem.
933
936
  Parameters:
934
- Path: Local file path to set the working directory for the flow
937
+ path: Local file path to set the working directory for the flow
935
938
  Examples:
936
939
  Sets the working directory for the local path to the flow:
937
940
  ```python
@@ -996,7 +999,7 @@ def create_storage_from_source(
996
999
  Creates a storage object from a URL.
997
1000
 
998
1001
  Args:
999
- url: The URL to create a storage object from. Supports git and `fsspec`
1002
+ source: The URL to create a storage object from. Supports git and `fsspec`
1000
1003
  URLs.
1001
1004
  pull_interval: The interval at which to pull contents from remote storage to
1002
1005
  local storage