prefect-client 3.6.23.dev2__tar.gz → 3.6.23.dev4__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 (405) hide show
  1. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/PKG-INFO +1 -1
  2. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/AGENTS.md +3 -0
  3. prefect_client-3.6.23.dev4/src/prefect/_build_info.py +5 -0
  4. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/__init__.py +77 -0
  5. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_work_pools/client.py +86 -1
  6. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/routes.py +2 -0
  7. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/objects.py +14 -0
  8. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/responses.py +48 -0
  9. prefect_client-3.6.23.dev4/src/prefect/deployments/AGENTS.md +39 -0
  10. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/runner.py +41 -10
  11. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/utility.py +91 -17
  12. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/docker/docker_image.py +13 -1
  13. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/flows.py +37 -11
  14. prefect_client-3.6.23.dev4/src/prefect/runner/AGENTS.md +67 -0
  15. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/work_queues.py +115 -19
  16. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/workers.py +168 -16
  17. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/tasks.py +1 -1
  18. prefect_client-3.6.23.dev2/src/prefect/_build_info.py +0 -5
  19. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/.gitignore +0 -0
  20. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/LICENSE +0 -0
  21. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/README.md +0 -0
  22. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/pyproject.toml +0 -0
  23. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/.prefectignore +0 -0
  24. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/__init__.py +0 -0
  25. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/__main__.py +0 -0
  26. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/__init__.py +0 -0
  27. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/__init__.py +0 -0
  28. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
  29. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
  30. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
  31. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
  32. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
  33. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/execute.py +0 -0
  34. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/__init__.py +0 -0
  35. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/apply.py +0 -0
  36. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  37. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/manager.py +0 -0
  38. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/spec.py +0 -0
  39. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/sla/__init__.py +0 -0
  40. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/sla/client.py +0 -0
  41. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/sla/objects.py +0 -0
  42. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/__init__.py +0 -0
  43. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/_logging.py +0 -0
  44. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/__init__.py +0 -0
  45. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  46. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/client.py +0 -0
  47. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/device_id.py +0 -0
  48. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/emit.py +0 -0
  49. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/enabled.py +0 -0
  50. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/events.py +0 -0
  51. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/milestones.py +0 -0
  52. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/notice.py +0 -0
  53. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/service.py +0 -0
  54. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/__init__.py +0 -0
  55. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  56. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/backports.py +0 -0
  57. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/blocks.py +0 -0
  58. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  59. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/migration.py +0 -0
  60. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/starlette.py +0 -0
  61. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/__init__.py +0 -0
  62. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/api.py +0 -0
  63. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/calls.py +0 -0
  64. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  65. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  66. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/inspection.py +0 -0
  67. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/primitives.py +0 -0
  68. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/services.py +0 -0
  69. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/threads.py +0 -0
  70. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/waiters.py +0 -0
  71. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/installation.py +0 -0
  72. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/integrations.py +0 -0
  73. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/lazy.py +0 -0
  74. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/observability.py +0 -0
  75. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/__init__.py +0 -0
  76. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/schemas.py +0 -0
  77. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  78. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  79. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  80. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pytz.py +0 -0
  81. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/retries.py +0 -0
  82. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/__init__.py +0 -0
  83. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/bases.py +0 -0
  84. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/fields.py +0 -0
  85. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/serializers.py +0 -0
  86. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/validators.py +0 -0
  87. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  88. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/testing.py +0 -0
  89. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/urls.py +0 -0
  90. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/uuid7.py +0 -0
  91. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/websockets.py +0 -0
  92. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_observers.py +0 -0
  93. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_result_records.py +0 -0
  94. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/__init__.py +0 -0
  95. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/fetcher.py +0 -0
  96. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/generator.py +0 -0
  97. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/models.py +0 -0
  98. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/naming.py +0 -0
  99. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/renderer.py +0 -0
  100. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/schema_converter.py +0 -0
  101. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/templates/__init__.py +0 -0
  102. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  103. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/types.py +0 -0
  104. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/unions.py +0 -0
  105. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_states.py +0 -0
  106. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_vendor/croniter/__init__.py +0 -0
  107. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_vendor/croniter/croniter.py +0 -0
  108. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_versioning.py +0 -0
  109. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_waiters.py +0 -0
  110. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/agent.py +0 -0
  111. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/analytics/__init__.py +0 -0
  112. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/artifacts.py +0 -0
  113. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/assets/__init__.py +0 -0
  114. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/assets/core.py +0 -0
  115. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/assets/materialize.py +0 -0
  116. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/automations.py +0 -0
  117. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/__init__.py +0 -0
  118. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/abstract.py +0 -0
  119. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/core.py +0 -0
  120. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/fields.py +0 -0
  121. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/notifications.py +0 -0
  122. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/redis.py +0 -0
  123. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/system.py +0 -0
  124. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/webhook.py +0 -0
  125. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/cache_policies.py +0 -0
  126. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/AGENTS.md +0 -0
  127. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/__init__.py +0 -0
  128. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/_version_checking.py +0 -0
  129. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/attribution.py +0 -0
  130. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/base.py +0 -0
  131. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/cloud.py +0 -0
  132. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/collections.py +0 -0
  133. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/constants.py +0 -0
  134. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  135. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  136. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  137. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_automations/client.py +0 -0
  138. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  139. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  140. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  141. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  142. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  143. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  144. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  145. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  146. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  147. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  148. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  149. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_events/client.py +0 -0
  150. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  151. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  152. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  153. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_flows/client.py +0 -0
  154. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  155. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_logs/client.py +0 -0
  156. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  157. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_variables/client.py +0 -0
  158. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  159. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/base.py +0 -0
  160. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/__init__.py +0 -0
  161. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/actions.py +0 -0
  162. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/events.py +0 -0
  163. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/filters.py +0 -0
  164. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/schedules.py +0 -0
  165. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/sorting.py +0 -0
  166. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/subscriptions.py +0 -0
  167. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/types/__init__.py +0 -0
  168. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  169. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/utilities.py +0 -0
  170. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/AGENTS.md +0 -0
  171. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/__init__.py +0 -0
  172. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/_asyncio.py +0 -0
  173. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/_events.py +0 -0
  174. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/_leases.py +0 -0
  175. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/_sync.py +0 -0
  176. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/asyncio.py +0 -0
  177. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/context.py +0 -0
  178. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/services.py +0 -0
  179. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/sync.py +0 -0
  180. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/__init__.py +0 -0
  181. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  182. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/_events.py +0 -0
  183. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/asyncio.py +0 -0
  184. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/context.py +0 -0
  185. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/services.py +0 -0
  186. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/sync.py +0 -0
  187. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/context.py +0 -0
  188. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/__init__.py +0 -0
  189. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/base.py +0 -0
  190. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/deployments.py +0 -0
  191. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/flow_runs.py +0 -0
  192. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/schedules.py +0 -0
  193. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/__init__.py +0 -0
  194. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/core.py +0 -0
  195. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/pull.py +0 -0
  196. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/docker/__init__.py +0 -0
  197. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/engine.py +0 -0
  198. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/AGENTS.md +0 -0
  199. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/__init__.py +0 -0
  200. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/actions.py +0 -0
  201. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/clients.py +0 -0
  202. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/filters.py +0 -0
  203. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/related.py +0 -0
  204. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/__init__.py +0 -0
  205. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/automations.py +0 -0
  206. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  207. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/events.py +0 -0
  208. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/labelling.py +0 -0
  209. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/subscribers.py +0 -0
  210. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/utilities.py +0 -0
  211. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/worker.py +0 -0
  212. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/exceptions.py +0 -0
  213. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/filesystems.py +0 -0
  214. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/flow_engine.py +0 -0
  215. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/flow_runs.py +0 -0
  216. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/futures.py +0 -0
  217. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/__init__.py +0 -0
  218. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/base.py +0 -0
  219. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  220. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  221. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  222. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  223. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  224. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  225. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/input/__init__.py +0 -0
  226. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/input/actions.py +0 -0
  227. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/input/run_input.py +0 -0
  228. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/locking/__init__.py +0 -0
  229. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/locking/filesystem.py +0 -0
  230. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/locking/memory.py +0 -0
  231. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/locking/protocol.py +0 -0
  232. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/AGENTS.md +0 -0
  233. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/__init__.py +0 -0
  234. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/clients.py +0 -0
  235. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/configuration.py +0 -0
  236. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/filters.py +0 -0
  237. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/formatters.py +0 -0
  238. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/handlers.py +0 -0
  239. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/highlighters.py +0 -0
  240. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/loggers.py +0 -0
  241. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/logging.yml +0 -0
  242. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/main.py +0 -0
  243. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/plugins.py +0 -0
  244. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/py.typed +0 -0
  245. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/results.py +0 -0
  246. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/__init__.py +0 -0
  247. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_cancellation_manager.py +0 -0
  248. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_deployment_registry.py +0 -0
  249. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_event_emitter.py +0 -0
  250. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_flow_resolver.py +0 -0
  251. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_flow_run_executor.py +0 -0
  252. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_hook_runner.py +0 -0
  253. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_limit_manager.py +0 -0
  254. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_process_manager.py +0 -0
  255. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  256. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_starter_bundle.py +0 -0
  257. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_starter_direct.py +0 -0
  258. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_starter_engine.py +0 -0
  259. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_state_proposer.py +0 -0
  260. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/runner.py +0 -0
  261. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/server.py +0 -0
  262. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/storage.py +0 -0
  263. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runtime/__init__.py +0 -0
  264. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runtime/deployment.py +0 -0
  265. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runtime/flow_run.py +0 -0
  266. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runtime/task_run.py +0 -0
  267. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/schedules.py +0 -0
  268. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/serializers.py +0 -0
  269. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/__init__.py +0 -0
  270. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/admin.py +0 -0
  271. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/artifacts.py +0 -0
  272. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/automations.py +0 -0
  273. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/background_workers.py +0 -0
  274. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/block_capabilities.py +0 -0
  275. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/block_documents.py +0 -0
  276. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/block_schemas.py +0 -0
  277. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/block_types.py +0 -0
  278. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/clients.py +0 -0
  279. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/collections.py +0 -0
  280. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  281. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/concurrency_limits.py +0 -0
  282. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  283. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/csrf_token.py +0 -0
  284. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/dependencies.py +0 -0
  285. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/deployments.py +0 -0
  286. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/events.py +0 -0
  287. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/flow_run_states.py +0 -0
  288. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/flow_runs.py +0 -0
  289. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/flows.py +0 -0
  290. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/logs.py +0 -0
  291. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/middleware.py +0 -0
  292. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/root.py +0 -0
  293. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/run_history.py +0 -0
  294. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/saved_searches.py +0 -0
  295. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/server.py +0 -0
  296. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  297. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/task_run_states.py +0 -0
  298. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/task_runs.py +0 -0
  299. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/task_workers.py +0 -0
  300. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/templates.py +0 -0
  301. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/__init__.py +0 -0
  302. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/flow_runs.py +0 -0
  303. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/flows.py +0 -0
  304. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/schemas.py +0 -0
  305. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/task_runs.py +0 -0
  306. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/validation.py +0 -0
  307. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/variables.py +0 -0
  308. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/AGENTS.md +0 -0
  309. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/__init__.py +0 -0
  310. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/base.py +0 -0
  311. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/constants.py +0 -0
  312. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/context.py +0 -0
  313. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/legacy.py +0 -0
  314. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/__init__.py +0 -0
  315. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/_defaults.py +0 -0
  316. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/api.py +0 -0
  317. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/cli.py +0 -0
  318. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/client.py +0 -0
  319. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/cloud.py +0 -0
  320. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/deployments.py +0 -0
  321. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/experiments.py +0 -0
  322. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/flows.py +0 -0
  323. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/internal.py +0 -0
  324. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/logging.py +0 -0
  325. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/results.py +0 -0
  326. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/root.py +0 -0
  327. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/runner.py +0 -0
  328. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/__init__.py +0 -0
  329. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/api.py +0 -0
  330. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/concurrency.py +0 -0
  331. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/database.py +0 -0
  332. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/deployments.py +0 -0
  333. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/docket.py +0 -0
  334. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/ephemeral.py +0 -0
  335. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/events.py +0 -0
  336. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  337. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/logs.py +0 -0
  338. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/root.py +0 -0
  339. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/services.py +0 -0
  340. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/ui.py +0 -0
  341. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/tasks.py +0 -0
  342. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/telemetry.py +0 -0
  343. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/testing.py +0 -0
  344. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/worker.py +0 -0
  345. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/profiles.py +0 -0
  346. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/profiles.toml +0 -0
  347. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/sources.py +0 -0
  348. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/states.py +0 -0
  349. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/task_engine.py +0 -0
  350. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/task_runners.py +0 -0
  351. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/task_runs.py +0 -0
  352. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/task_worker.py +0 -0
  353. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/tasks.py +0 -0
  354. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/telemetry/__init__.py +0 -0
  355. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/telemetry/_metrics.py +0 -0
  356. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/telemetry/run_telemetry.py +0 -0
  357. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/transactions.py +0 -0
  358. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/__init__.py +0 -0
  359. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/_concurrency.py +0 -0
  360. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/_datetime.py +0 -0
  361. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/_schema.py +0 -0
  362. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/entrypoint.py +0 -0
  363. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/names.py +0 -0
  364. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/__init__.py +0 -0
  365. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_ast.py +0 -0
  366. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_deprecated.py +0 -0
  367. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_engine.py +0 -0
  368. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_git.py +0 -0
  369. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
  370. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/annotations.py +0 -0
  371. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/asyncutils.py +0 -0
  372. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/callables.py +0 -0
  373. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/collections.py +0 -0
  374. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/compat.py +0 -0
  375. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/context.py +0 -0
  376. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/dispatch.py +0 -0
  377. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/dockerutils.py +0 -0
  378. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/engine.py +0 -0
  379. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/filesystem.py +0 -0
  380. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/generics.py +0 -0
  381. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/hashing.py +0 -0
  382. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/importtools.py +0 -0
  383. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/math.py +0 -0
  384. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/names.py +0 -0
  385. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/processutils.py +0 -0
  386. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/pydantic.py +0 -0
  387. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/render_swagger.py +0 -0
  388. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  389. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  390. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/schema_tools/validation.py +0 -0
  391. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/services.py +0 -0
  392. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/slugify.py +0 -0
  393. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/templating.py +0 -0
  394. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/text.py +0 -0
  395. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/timeout.py +0 -0
  396. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/urls.py +0 -0
  397. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/visualization.py +0 -0
  398. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/variables.py +0 -0
  399. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/__init__.py +0 -0
  400. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/base.py +0 -0
  401. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/block.py +0 -0
  402. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/cloud.py +0 -0
  403. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/process.py +0 -0
  404. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/server.py +0 -0
  405. {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/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.6.23.dev2
3
+ Version: 3.6.23.dev4
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
@@ -46,4 +46,7 @@ Use `get_logger()` from `prefect.logging` instead of raw `logging.getLogger()`
46
46
  - `settings/` → Configuration system (see settings/AGENTS.md)
47
47
  - `concurrency/` → Concurrency slot acquisition and lease management (see concurrency/AGENTS.md)
48
48
  - `logging/` → Logging handlers, API log shipping, and run-context loggers (see logging/AGENTS.md)
49
+ - `runner/` → Thin facade over extracted single-responsibility classes for local flow run execution (see runner/AGENTS.md)
50
+ - `deployments/` → YAML-driven deployment lifecycle: project init, build/push/pull steps, and triggering remote flow runs (see deployments/AGENTS.md)
51
+ - `docker/` → `DockerImage` class for building and pushing Docker images during deployment
49
52
  - `telemetry/` → OS-level resource metric collection and run telemetry
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.6.23.dev4"
3
+ __build_date__ = "2026-03-19 08:18:50.089319+00:00"
4
+ __git_commit__ = "e5a389c661e12028d1e94766dda38f85c2e1d9c2"
5
+ __dirty__ = False
@@ -143,6 +143,7 @@ from prefect.client._version_checking import (
143
143
  )
144
144
 
145
145
  if TYPE_CHECKING:
146
+ from prefect.client.schemas.responses import WorkQueueConcurrencyStatus
146
147
  from prefect.tasks import Task as TaskObject
147
148
 
148
149
  from prefect.client.base import (
@@ -713,6 +714,44 @@ class PrefectClient(
713
714
  raise
714
715
  return WorkQueueStatusDetail.model_validate(response.json())
715
716
 
717
+ async def read_work_queue_concurrency_status(
718
+ self,
719
+ id: UUID,
720
+ page: int = 1,
721
+ limit: Optional[int] = None,
722
+ ) -> "WorkQueueConcurrencyStatus":
723
+ """
724
+ Read concurrency status for a work queue.
725
+
726
+ Args:
727
+ id: the id of the work queue
728
+ page: Page number (1-indexed).
729
+ limit: Max flow runs per page (server default if None).
730
+
731
+ Raises:
732
+ prefect.exceptions.ObjectNotFound: If request returns 404
733
+ httpx.RequestError: If request fails
734
+
735
+ Returns:
736
+ Paginated WorkQueueConcurrencyStatus with flow run summaries
737
+ """
738
+ from prefect.client.schemas.responses import WorkQueueConcurrencyStatus
739
+
740
+ body: dict = {"page": page}
741
+ if limit is not None:
742
+ body["limit"] = limit
743
+
744
+ try:
745
+ response = await self._client.post(
746
+ f"/work_queues/{id}/concurrency_status", json=body
747
+ )
748
+ except httpx.HTTPStatusError as e:
749
+ if e.response.status_code == status.HTTP_404_NOT_FOUND:
750
+ raise prefect.exceptions.ObjectNotFound(http_exc=e) from e
751
+ else:
752
+ raise
753
+ return WorkQueueConcurrencyStatus.model_validate(response.json())
754
+
716
755
  async def match_work_queues(
717
756
  self,
718
757
  prefixes: list[str],
@@ -1882,6 +1921,44 @@ class SyncPrefectClient(
1882
1921
  raise
1883
1922
  return WorkQueueStatusDetail.model_validate(response.json())
1884
1923
 
1924
+ def read_work_queue_concurrency_status(
1925
+ self,
1926
+ id: UUID,
1927
+ page: int = 1,
1928
+ limit: Optional[int] = None,
1929
+ ) -> "WorkQueueConcurrencyStatus":
1930
+ """
1931
+ Read concurrency status for a work queue.
1932
+
1933
+ Args:
1934
+ id: the id of the work queue
1935
+ page: Page number (1-indexed).
1936
+ limit: Max flow runs per page (server default if None).
1937
+
1938
+ Raises:
1939
+ prefect.exceptions.ObjectNotFound: If request returns 404
1940
+ httpx.RequestError: If request fails
1941
+
1942
+ Returns:
1943
+ Paginated WorkQueueConcurrencyStatus with flow run summaries
1944
+ """
1945
+ from prefect.client.schemas.responses import WorkQueueConcurrencyStatus
1946
+
1947
+ body: dict = {"page": page}
1948
+ if limit is not None:
1949
+ body["limit"] = limit
1950
+
1951
+ try:
1952
+ response = self._client.post(
1953
+ f"/work_queues/{id}/concurrency_status", json=body
1954
+ )
1955
+ except httpx.HTTPStatusError as e:
1956
+ if e.response.status_code == status.HTTP_404_NOT_FOUND:
1957
+ raise prefect.exceptions.ObjectNotFound(http_exc=e) from e
1958
+ else:
1959
+ raise
1960
+ return WorkQueueConcurrencyStatus.model_validate(response.json())
1961
+
1885
1962
  def match_work_queues(
1886
1963
  self,
1887
1964
  prefixes: list[str],
@@ -25,7 +25,10 @@ if TYPE_CHECKING:
25
25
  WorkerMetadata,
26
26
  WorkPool,
27
27
  )
28
- from prefect.client.schemas.responses import WorkerFlowRunResponse
28
+ from prefect.client.schemas.responses import (
29
+ WorkerFlowRunResponse,
30
+ WorkPoolConcurrencyStatus,
31
+ )
29
32
 
30
33
  from prefect.exceptions import ObjectAlreadyExists, ObjectNotFound, ObjectUnsupported
31
34
 
@@ -316,6 +319,47 @@ class WorkPoolClient(BaseClient):
316
319
 
317
320
  return WorkerFlowRunResponse.model_validate_list(response.json())
318
321
 
322
+ def read_work_pool_concurrency_status(
323
+ self,
324
+ work_pool_name: str,
325
+ page: int = 1,
326
+ limit: int | None = None,
327
+ flow_run_limit: int = 10,
328
+ ) -> "WorkPoolConcurrencyStatus":
329
+ """
330
+ Reads concurrency status for a work pool.
331
+
332
+ Args:
333
+ work_pool_name: The name of the work pool.
334
+ page: Page number (1-indexed).
335
+ limit: Max queues per page (server default if None).
336
+ flow_run_limit: Max flow runs per queue (0-200).
337
+
338
+ Returns:
339
+ Paginated concurrency status with per-queue breakdown.
340
+ """
341
+ from prefect.client.schemas.responses import WorkPoolConcurrencyStatus
342
+
343
+ body: dict[str, Any] = {"page": page}
344
+ if limit is not None:
345
+ body["limit"] = limit
346
+ body["flow_run_limit"] = flow_run_limit
347
+
348
+ try:
349
+ response = self.request(
350
+ "POST",
351
+ "/work_pools/{name}/concurrency_status",
352
+ path_params={"name": work_pool_name},
353
+ json=body,
354
+ )
355
+ except HTTPStatusError as e:
356
+ if e.response.status_code == 404:
357
+ raise ObjectNotFound(http_exc=e) from e
358
+ else:
359
+ raise
360
+
361
+ return WorkPoolConcurrencyStatus.model_validate(response.json())
362
+
319
363
 
320
364
  class WorkPoolAsyncClient(BaseAsyncClient):
321
365
  async def send_worker_heartbeat(
@@ -599,3 +643,44 @@ class WorkPoolAsyncClient(BaseAsyncClient):
599
643
  raise
600
644
 
601
645
  return WorkerFlowRunResponse.model_validate_list(response.json())
646
+
647
+ async def read_work_pool_concurrency_status(
648
+ self,
649
+ work_pool_name: str,
650
+ page: int = 1,
651
+ limit: int | None = None,
652
+ flow_run_limit: int = 10,
653
+ ) -> "WorkPoolConcurrencyStatus":
654
+ """
655
+ Reads concurrency status for a work pool.
656
+
657
+ Args:
658
+ work_pool_name: The name of the work pool.
659
+ page: Page number (1-indexed).
660
+ limit: Max queues per page (server default if None).
661
+ flow_run_limit: Max flow runs per queue (0-200).
662
+
663
+ Returns:
664
+ Paginated concurrency status with per-queue breakdown.
665
+ """
666
+ from prefect.client.schemas.responses import WorkPoolConcurrencyStatus
667
+
668
+ body: dict[str, Any] = {"page": page}
669
+ if limit is not None:
670
+ body["limit"] = limit
671
+ body["flow_run_limit"] = flow_run_limit
672
+
673
+ try:
674
+ response = await self.request(
675
+ "POST",
676
+ "/work_pools/{name}/concurrency_status",
677
+ path_params={"name": work_pool_name},
678
+ json=body,
679
+ )
680
+ except HTTPStatusError as e:
681
+ if e.response.status_code == 404:
682
+ raise ObjectNotFound(http_exc=e) from e
683
+ else:
684
+ raise
685
+
686
+ return WorkPoolConcurrencyStatus.model_validate(response.json())
@@ -125,6 +125,7 @@ ServerRoutes = Literal[
125
125
  "/version",
126
126
  "/work_pools/",
127
127
  "/work_pools/{name}",
128
+ "/work_pools/{name}/concurrency_status",
128
129
  "/work_pools/{name}/get_scheduled_flow_runs",
129
130
  "/work_pools/{work_pool_name}/queues",
130
131
  "/work_pools/{work_pool_name}/queues/{name}",
@@ -137,6 +138,7 @@ ServerRoutes = Literal[
137
138
  "/work_queues/",
138
139
  "/work_queues/{id}",
139
140
  "/work_queues/{id}/get_runs",
141
+ "/work_queues/{id}/concurrency_status",
140
142
  "/work_queues/{id}/status",
141
143
  "/work_queues/filter",
142
144
  "/work_queues/name/{name}",
@@ -1433,6 +1433,13 @@ class WorkQueue(ObjectBaseModel):
1433
1433
  status: Optional[WorkQueueStatus] = Field(
1434
1434
  default=None, description="The queue status."
1435
1435
  )
1436
+ active_slots: Optional[int] = Field(
1437
+ default=None,
1438
+ description=(
1439
+ "The number of concurrency slots currently in use. "
1440
+ "None when concurrency_limit is not set."
1441
+ ),
1442
+ )
1436
1443
 
1437
1444
 
1438
1445
  class WorkQueueHealthPolicy(PrefectBaseModel):
@@ -1554,6 +1561,13 @@ class WorkPool(ObjectBaseModel):
1554
1561
  status: Optional[WorkPoolStatus] = Field(
1555
1562
  default=None, description="The current status of the work pool."
1556
1563
  )
1564
+ active_slots: Optional[int] = Field(
1565
+ default=None,
1566
+ description=(
1567
+ "The number of concurrency slots occupied by pending or running "
1568
+ "flow runs. None when concurrency_limit is not set."
1569
+ ),
1570
+ )
1557
1571
 
1558
1572
  storage_configuration: WorkPoolStorageConfiguration = Field(
1559
1573
  default_factory=WorkPoolStorageConfiguration,
@@ -1,4 +1,5 @@
1
1
  import datetime
2
+ from datetime import timedelta
2
3
  from typing import TYPE_CHECKING, Any, ClassVar, Generic, Optional, TypeVar, Union
3
4
  from uuid import UUID
4
5
 
@@ -501,3 +502,50 @@ class GlobalConcurrencyLimitResponse(ObjectBaseModel):
501
502
  default=2.0,
502
503
  description="The decay rate for active slots when used as a rate limit.",
503
504
  )
505
+
506
+
507
+ class FlowRunSlotSummary(PrefectBaseModel):
508
+ """Summary of a flow run occupying a concurrency slot."""
509
+
510
+ id: UUID
511
+ name: str
512
+ state_type: Optional[objects.StateType] = None
513
+ state_name: Optional[str] = None
514
+ start_time: Optional[DateTime] = None
515
+ state_timestamp: Optional[DateTime] = None
516
+ time_in_current_state: Optional[timedelta] = None
517
+
518
+
519
+ class WorkQueueConcurrencyStatusDetail(PrefectBaseModel):
520
+ """Per-queue concurrency status with flow run details."""
521
+
522
+ queue_id: UUID
523
+ queue_name: str
524
+ active_slots: int
525
+ concurrency_limit: Optional[int] = None
526
+ flow_runs: list[FlowRunSlotSummary] = Field(default_factory=list)
527
+ flow_run_count: Optional[int] = None
528
+
529
+
530
+ class WorkPoolConcurrencyStatus(PrefectBaseModel):
531
+ """Paginated pool-level concurrency status with per-queue breakdown."""
532
+
533
+ active_slots: int
534
+ concurrency_limit: Optional[int] = None
535
+ queues: list[WorkQueueConcurrencyStatusDetail] = Field(default_factory=list)
536
+ count: int
537
+ limit: int
538
+ pages: int
539
+ page: int
540
+
541
+
542
+ class WorkQueueConcurrencyStatus(PrefectBaseModel):
543
+ """Paginated queue-level concurrency status with flow run details."""
544
+
545
+ active_slots: int
546
+ concurrency_limit: Optional[int] = None
547
+ flow_runs: list[FlowRunSlotSummary] = Field(default_factory=list)
548
+ count: int
549
+ limit: int
550
+ pages: int
551
+ page: int
@@ -0,0 +1,39 @@
1
+ # Deployments
2
+
3
+ YAML-driven configuration for packaging, publishing, and triggering flow runs from infrastructure.
4
+
5
+ ## Purpose & Scope
6
+
7
+ Handles deployment lifecycle: initializing projects, building/pushing deployment artifacts, and triggering remote flow runs. Does NOT manage flow execution itself — that lives in `flow_engine.py` and `task_engine.py`.
8
+
9
+ ## Entry Points & Contracts
10
+
11
+ - `runner.py` → `deploy()` — programmatic deployment creation from `Flow` objects
12
+ - `flow_runs.py` → `run_deployment()` / `arun_deployment()` — trigger a run of an existing deployment
13
+ - `base.py` → `initialize_project()` — scaffold `prefect.yaml` in a project directory
14
+ - `steps/core.py` → `run_step()` / `run_steps()` — execute lifecycle steps defined in `prefect.yaml`
15
+
16
+ ## Steps System
17
+
18
+ Steps are YAML entries in `build`, `push`, or `pull` blocks of `prefect.yaml`. Each step maps to a Python function imported at runtime. The `requires` keyword auto-installs missing packages before import.
19
+
20
+ Step outputs are templated into subsequent steps via `{{ step-id.key }}`.
21
+
22
+ Built-in steps:
23
+ - `steps/pull.py` — `git_clone`, `set_working_directory`, `pull_from_remote_storage`
24
+ - `steps/utility.py` — `run_shell_script`, `pip_install_requirements`
25
+
26
+ ## Entrypoint Formats
27
+
28
+ `runner.py`'s `from_storage` / `afrom_storage` (and `Flow.from_source`) support two entrypoint formats:
29
+ - **File path**: `path/to/file.py:flow_func_name` — detected by presence of `:`
30
+ - **Module path**: `my_package.flows.flow_func` — detected by absence of `:`
31
+
32
+ For module path entrypoints, the storage destination is temporarily prepended to `sys.path` so the module can be imported, then removed in a `finally` block. Any new code that loads flows from module paths must follow this same pattern to avoid polluting `sys.path`.
33
+
34
+ ## Pitfalls
35
+
36
+ - **Windows shell mode**: `run_shell_script` always uses `asyncio.create_subprocess_shell` on Windows (`sys.platform == "win32"`), regardless of the `shell` parameter. This ensures cmd.exe built-ins (`echo`, `dir`, `set`, etc.) work. On non-Windows, `shell=False` (default) uses `create_subprocess_exec` with `shlex.split`.
37
+ - **Step ID namespace**: `id` and `requires` are reserved keywords — do not use them as step output keys.
38
+ - **Step import side effects**: steps are imported dynamically; packages listed in `requires` are installed into the current environment at execution time.
39
+ - **String `image` argument suppresses build/push output.** When `deploy()` / `adeploy()` receives `image` as a plain string, it constructs `DockerImage(stream_progress_to=None)`, silencing all build and push progress. `DockerImage` itself defaults to `sys.stdout`, so users who pass a string get no output. To see build/push progress, pass a `DockerImage` object explicitly: `DockerImage("registry/image:tag", stream_progress_to=sys.stdout)`.
@@ -32,6 +32,7 @@ Example:
32
32
  from __future__ import annotations
33
33
 
34
34
  import importlib
35
+ import sys
35
36
  import tempfile
36
37
  from datetime import datetime, timedelta
37
38
  from pathlib import Path
@@ -1160,7 +1161,8 @@ class RunnerDeployment(BaseModel):
1160
1161
 
1161
1162
  Args:
1162
1163
  entrypoint: The path to a file containing a flow and the name of the flow function in
1163
- the format `./path/to/file.py:flow_func_name`.
1164
+ the format `./path/to/file.py:flow_func_name`, or a module path to a flow function
1165
+ in the format `module.path.flow_func_name`.
1164
1166
  name: A name for the deployment
1165
1167
  flow_name: The name of the flow to deploy
1166
1168
  storage: A storage object to use for retrieving flow code. If not provided, a
@@ -1213,10 +1215,19 @@ class RunnerDeployment(BaseModel):
1213
1215
  storage.set_base_path(Path(tmpdir))
1214
1216
  await storage.pull_code()
1215
1217
 
1216
- full_entrypoint = str(storage.destination / entrypoint)
1217
- flow = await from_async.wait_for_call_in_new_thread(
1218
- create_call(load_flow_from_entrypoint, full_entrypoint)
1219
- )
1218
+ if ":" in entrypoint:
1219
+ full_entrypoint = str(storage.destination / entrypoint)
1220
+ else:
1221
+ sys.path.insert(0, str(storage.destination))
1222
+ full_entrypoint = entrypoint
1223
+
1224
+ try:
1225
+ flow = await from_async.wait_for_call_in_new_thread(
1226
+ create_call(load_flow_from_entrypoint, full_entrypoint)
1227
+ )
1228
+ finally:
1229
+ if ":" not in entrypoint:
1230
+ sys.path.remove(str(storage.destination))
1220
1231
 
1221
1232
  deployment = cls(
1222
1233
  name=name,
@@ -1239,6 +1250,11 @@ class RunnerDeployment(BaseModel):
1239
1250
  job_variables=job_variables,
1240
1251
  )
1241
1252
  deployment._sla = _sla
1253
+ deployment._entrypoint_type = (
1254
+ EntrypointType.FILE_PATH
1255
+ if ":" in entrypoint
1256
+ else EntrypointType.MODULE_PATH
1257
+ )
1242
1258
  deployment._path = str(storage.destination).replace(
1243
1259
  tmpdir, "$STORAGE_BASE_PATH"
1244
1260
  )
@@ -1282,7 +1298,8 @@ class RunnerDeployment(BaseModel):
1282
1298
 
1283
1299
  Args:
1284
1300
  entrypoint: The path to a file containing a flow and the name of the flow function in
1285
- the format `./path/to/file.py:flow_func_name`.
1301
+ the format `./path/to/file.py:flow_func_name`, or a module path to a flow function
1302
+ in the format `module.path.flow_func_name`.
1286
1303
  name: A name for the deployment
1287
1304
  flow_name: The name of the flow to deploy
1288
1305
  storage: A storage object to use for retrieving flow code. If not provided, a
@@ -1335,8 +1352,17 @@ class RunnerDeployment(BaseModel):
1335
1352
  storage.set_base_path(Path(tmpdir))
1336
1353
  run_coro_as_sync(storage.pull_code())
1337
1354
 
1338
- full_entrypoint = str(storage.destination / entrypoint)
1339
- flow = load_flow_from_entrypoint(full_entrypoint)
1355
+ if ":" in entrypoint:
1356
+ full_entrypoint = str(storage.destination / entrypoint)
1357
+ else:
1358
+ sys.path.insert(0, str(storage.destination))
1359
+ full_entrypoint = entrypoint
1360
+
1361
+ try:
1362
+ flow = load_flow_from_entrypoint(full_entrypoint)
1363
+ finally:
1364
+ if ":" not in entrypoint:
1365
+ sys.path.remove(str(storage.destination))
1340
1366
 
1341
1367
  deployment = cls(
1342
1368
  name=name,
@@ -1359,6 +1385,11 @@ class RunnerDeployment(BaseModel):
1359
1385
  job_variables=job_variables,
1360
1386
  )
1361
1387
  deployment._sla = _sla
1388
+ deployment._entrypoint_type = (
1389
+ EntrypointType.FILE_PATH
1390
+ if ":" in entrypoint
1391
+ else EntrypointType.MODULE_PATH
1392
+ )
1362
1393
  deployment._path = str(storage.destination).replace(
1363
1394
  tmpdir, "$STORAGE_BASE_PATH"
1364
1395
  )
@@ -1448,7 +1479,7 @@ async def adeploy(
1448
1479
 
1449
1480
  if image and isinstance(image, str):
1450
1481
  image_name, image_tag = parse_image_tag(image)
1451
- image = DockerImage(name=image_name, tag=image_tag)
1482
+ image = DockerImage(name=image_name, tag=image_tag, stream_progress_to=None)
1452
1483
 
1453
1484
  try:
1454
1485
  async with get_client() as client:
@@ -1687,7 +1718,7 @@ def deploy(
1687
1718
 
1688
1719
  if image and isinstance(image, str):
1689
1720
  image_name, image_tag = parse_image_tag(image)
1690
- image = DockerImage(name=image_name, tag=image_tag)
1721
+ image = DockerImage(name=image_name, tag=image_tag, stream_progress_to=None)
1691
1722
 
1692
1723
  try:
1693
1724
  with get_client(sync_client=True) as client:
@@ -20,6 +20,7 @@ Example:
20
20
  ```
21
21
  """
22
22
 
23
+ import asyncio
23
24
  import io
24
25
  import os
25
26
  import shlex
@@ -28,6 +29,7 @@ import subprocess
28
29
  import sys
29
30
  from typing import Any, Dict, Optional
30
31
 
32
+ import anyio
31
33
  from anyio import create_task_group
32
34
  from anyio.streams.text import TextReceiveStream
33
35
  from typing_extensions import TypedDict
@@ -60,6 +62,41 @@ async def _stream_capture_process_output(
60
62
  )
61
63
 
62
64
 
65
+ async def _read_stream(
66
+ stream: asyncio.StreamReader,
67
+ *sinks: io.IOBase,
68
+ ):
69
+ """Read from an asyncio stream and write to one or more sinks."""
70
+ while True:
71
+ data = await stream.read(4096)
72
+ if not data:
73
+ break
74
+ text = data.decode()
75
+ for sink in sinks:
76
+ sink.write(text)
77
+ if hasattr(sink, "flush"):
78
+ sink.flush()
79
+
80
+
81
+ async def _stream_capture_shell_process_output(
82
+ process: asyncio.subprocess.Process,
83
+ stdout_sink: io.StringIO,
84
+ stderr_sink: io.StringIO,
85
+ stream_output: bool = True,
86
+ ):
87
+ """Capture output from a shell subprocess (asyncio-based)."""
88
+ stdout_sinks = [stdout_sink, sys.stdout] if stream_output else [stdout_sink]
89
+ stderr_sinks = [stderr_sink, sys.stderr] if stream_output else [stderr_sink]
90
+
91
+ tasks = []
92
+ if process.stdout:
93
+ tasks.append(_read_stream(process.stdout, *stdout_sinks))
94
+ if process.stderr:
95
+ tasks.append(_read_stream(process.stderr, *stderr_sinks))
96
+
97
+ await asyncio.gather(*tasks)
98
+
99
+
63
100
  class RunShellScriptResult(TypedDict):
64
101
  """
65
102
  The result of a `run_shell_script` step.
@@ -79,6 +116,7 @@ async def run_shell_script(
79
116
  env: Optional[Dict[str, str]] = None,
80
117
  stream_output: bool = True,
81
118
  expand_env_vars: bool = False,
119
+ shell: bool = False,
82
120
  ) -> RunShellScriptResult:
83
121
  """
84
122
  Runs one or more shell commands in a subprocess. Returns the standard
@@ -93,6 +131,11 @@ async def run_shell_script(
93
131
  stdout/stderr
94
132
  expand_env_vars: Whether to expand environment variables in the script
95
133
  before running it
134
+ shell: Whether to run the command through the system shell.
135
+ When True, shell operators like pipes (|), redirects (>),
136
+ and logical operators (&&, ||) are supported. Only set this
137
+ to True when you need shell features, as it has security
138
+ implications similar to subprocess.run(shell=True).
96
139
 
97
140
  Returns:
98
141
  A dictionary with the keys `stdout` and `stderr` containing the output
@@ -158,6 +201,14 @@ async def run_shell_script(
158
201
  - prefect.deployments.steps.run_shell_script:
159
202
  script: "bash path/to/script.sh"
160
203
  ```
204
+
205
+ Run a command that uses shell operators like pipes:
206
+ ```yaml
207
+ push:
208
+ - prefect.deployments.steps.run_shell_script:
209
+ script: echo "hello world" | tr '[:lower:]' '[:upper:]'
210
+ shell: true
211
+ ```
161
212
  """
162
213
  current_env = os.environ.copy()
163
214
  current_env.update(env or {})
@@ -170,30 +221,53 @@ async def run_shell_script(
170
221
  if expand_env_vars:
171
222
  # Expand environment variables in command and provided environment
172
223
  command = string.Template(command).safe_substitute(current_env)
173
- split_command = shlex.split(command, posix=sys.platform != "win32")
174
- if not split_command:
175
- continue
176
- async with open_process(
177
- split_command,
178
- stdout=subprocess.PIPE,
179
- stderr=subprocess.PIPE,
180
- cwd=directory,
181
- env=current_env,
182
- ) as process:
183
- await _stream_capture_process_output(
224
+
225
+ # On Windows, always use shell mode so cmd.exe built-ins
226
+ # (echo, dir, set, type, etc.) work without requiring shell=True.
227
+ use_shell = shell or sys.platform == "win32"
228
+
229
+ if use_shell:
230
+ command = command.strip()
231
+ if not command:
232
+ continue
233
+ process = await asyncio.create_subprocess_shell(
234
+ command,
235
+ stdout=asyncio.subprocess.PIPE,
236
+ stderr=asyncio.subprocess.PIPE,
237
+ cwd=directory,
238
+ env=current_env,
239
+ )
240
+ else:
241
+ split_command = shlex.split(command)
242
+ if not split_command:
243
+ continue
244
+ process = await asyncio.create_subprocess_exec(
245
+ *split_command,
246
+ stdout=asyncio.subprocess.PIPE,
247
+ stderr=asyncio.subprocess.PIPE,
248
+ cwd=directory,
249
+ env=current_env,
250
+ )
251
+
252
+ try:
253
+ await _stream_capture_shell_process_output(
184
254
  process,
185
255
  stdout_sink=stdout_sink,
186
256
  stderr_sink=stderr_sink,
187
257
  stream_output=stream_output,
188
258
  )
189
-
190
259
  await process.wait()
260
+ except BaseException:
261
+ with anyio.CancelScope(shield=True):
262
+ process.kill()
263
+ await process.wait()
264
+ raise
191
265
 
192
- if process.returncode != 0:
193
- raise RuntimeError(
194
- f"`run_shell_script` failed with error code {process.returncode}:"
195
- f" {stderr_sink.getvalue()}"
196
- )
266
+ if process.returncode != 0:
267
+ raise RuntimeError(
268
+ f"`run_shell_script` failed with error code {process.returncode}:"
269
+ f" {stderr_sink.getvalue()}"
270
+ )
197
271
 
198
272
  return {
199
273
  "stdout": stdout_sink.getvalue().strip(),