prefect-client 3.6.26.dev5__tar.gz → 3.6.27.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/PKG-INFO +2 -2
  2. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/pyproject.toml +1 -1
  3. prefect_client-3.6.27.dev1/src/prefect/_build_info.py +5 -0
  4. prefect_client-3.6.27.dev1/src/prefect/_experimental/_launchers.py +106 -0
  5. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/__init__.py +52 -17
  6. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/flows.py +34 -6
  7. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_starter_engine.py +6 -3
  8. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/runner.py +2 -2
  9. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/_datetime.py +8 -1
  10. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/AGENTS.md +3 -1
  11. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/processutils.py +78 -9
  12. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/AGENTS.md +8 -0
  13. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/base.py +19 -6
  14. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/process.py +2 -2
  15. prefect_client-3.6.26.dev5/src/prefect/_build_info.py +0 -5
  16. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/.gitignore +0 -0
  17. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/LICENSE +0 -0
  18. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/README.md +0 -0
  19. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/.prefectignore +0 -0
  20. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/AGENTS.md +0 -0
  21. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/__init__.py +0 -0
  22. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/__main__.py +0 -0
  23. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/__init__.py +0 -0
  24. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
  25. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
  26. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
  27. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
  28. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
  29. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
  30. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/__init__.py +0 -0
  31. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/apply.py +0 -0
  32. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  33. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/manager.py +0 -0
  34. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/spec.py +0 -0
  35. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
  36. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/sla/client.py +0 -0
  37. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
  38. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/__init__.py +0 -0
  39. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/_logging.py +0 -0
  40. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/__init__.py +0 -0
  41. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  42. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/client.py +0 -0
  43. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/device_id.py +0 -0
  44. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/emit.py +0 -0
  45. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/enabled.py +0 -0
  46. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/events.py +0 -0
  47. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/milestones.py +0 -0
  48. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/notice.py +0 -0
  49. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/service.py +0 -0
  50. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
  51. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  52. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/backports.py +0 -0
  53. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
  54. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  55. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
  56. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/starlette.py +0 -0
  57. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
  58. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
  59. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
  60. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  61. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  62. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
  63. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
  64. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/services.py +0 -0
  65. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
  66. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
  67. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/installation.py +0 -0
  68. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/integrations.py +0 -0
  69. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/lazy.py +0 -0
  70. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/observability.py +0 -0
  71. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
  72. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
  73. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  74. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  75. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  76. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pytz.py +0 -0
  77. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/retries.py +0 -0
  78. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
  79. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
  80. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
  81. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
  82. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
  83. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  84. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/testing.py +0 -0
  85. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/urls.py +0 -0
  86. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/uuid7.py +0 -0
  87. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/websockets.py +0 -0
  88. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_observers.py +0 -0
  89. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_result_records.py +0 -0
  90. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/__init__.py +0 -0
  91. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/fetcher.py +0 -0
  92. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/generator.py +0 -0
  93. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/models.py +0 -0
  94. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/naming.py +0 -0
  95. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/renderer.py +0 -0
  96. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/schema_converter.py +0 -0
  97. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/templates/__init__.py +0 -0
  98. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  99. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/types.py +0 -0
  100. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/unions.py +0 -0
  101. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_states.py +0 -0
  102. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
  103. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
  104. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_versioning.py +0 -0
  105. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_waiters.py +0 -0
  106. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/agent.py +0 -0
  107. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/analytics/__init__.py +0 -0
  108. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/artifacts.py +0 -0
  109. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/assets/__init__.py +0 -0
  110. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/assets/core.py +0 -0
  111. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/assets/materialize.py +0 -0
  112. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/automations.py +0 -0
  113. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/AGENTS.md +0 -0
  114. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/__init__.py +0 -0
  115. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/abstract.py +0 -0
  116. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/core.py +0 -0
  117. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/fields.py +0 -0
  118. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/notifications.py +0 -0
  119. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/redis.py +0 -0
  120. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/system.py +0 -0
  121. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/webhook.py +0 -0
  122. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/cache_policies.py +0 -0
  123. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/AGENTS.md +0 -0
  124. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/__init__.py +0 -0
  125. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/_version_checking.py +0 -0
  126. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/attribution.py +0 -0
  127. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/base.py +0 -0
  128. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/cloud.py +0 -0
  129. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/collections.py +0 -0
  130. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/constants.py +0 -0
  131. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/__init__.py +0 -0
  132. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  133. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  134. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  135. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
  136. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  137. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  138. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  139. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  140. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  141. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  142. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  143. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  144. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  145. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  146. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  147. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_events/client.py +0 -0
  148. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  149. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  150. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  151. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
  152. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  153. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
  154. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  155. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
  156. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  157. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  158. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/base.py +0 -0
  159. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/routes.py +0 -0
  160. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/__init__.py +0 -0
  161. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/actions.py +0 -0
  162. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/events.py +0 -0
  163. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/filters.py +0 -0
  164. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/objects.py +0 -0
  165. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/responses.py +0 -0
  166. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/schedules.py +0 -0
  167. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/sorting.py +0 -0
  168. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/subscriptions.py +0 -0
  169. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/types/__init__.py +0 -0
  170. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  171. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/utilities.py +0 -0
  172. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/AGENTS.md +0 -0
  173. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/__init__.py +0 -0
  174. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/_asyncio.py +0 -0
  175. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/_events.py +0 -0
  176. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/_leases.py +0 -0
  177. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/_sync.py +0 -0
  178. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/asyncio.py +0 -0
  179. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/context.py +0 -0
  180. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/services.py +0 -0
  181. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/sync.py +0 -0
  182. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
  183. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  184. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
  185. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
  186. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/context.py +0 -0
  187. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/services.py +0 -0
  188. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
  189. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/context.py +0 -0
  190. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/AGENTS.md +0 -0
  191. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/__init__.py +0 -0
  192. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/base.py +0 -0
  193. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/deployments.py +0 -0
  194. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/flow_runs.py +0 -0
  195. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/runner.py +0 -0
  196. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/schedules.py +0 -0
  197. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
  198. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/steps/core.py +0 -0
  199. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/steps/pull.py +0 -0
  200. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/steps/utility.py +0 -0
  201. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/docker/__init__.py +0 -0
  202. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/docker/_buildx.py +0 -0
  203. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/docker/docker_image.py +0 -0
  204. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/engine.py +0 -0
  205. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/AGENTS.md +0 -0
  206. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/__init__.py +0 -0
  207. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/actions.py +0 -0
  208. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/clients.py +0 -0
  209. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/filters.py +0 -0
  210. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/related.py +0 -0
  211. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/__init__.py +0 -0
  212. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/automations.py +0 -0
  213. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  214. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/events.py +0 -0
  215. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/labelling.py +0 -0
  216. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/subscribers.py +0 -0
  217. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/utilities.py +0 -0
  218. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/worker.py +0 -0
  219. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/exceptions.py +0 -0
  220. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/filesystems.py +0 -0
  221. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/flow_engine.py +0 -0
  222. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/flow_runs.py +0 -0
  223. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/futures.py +0 -0
  224. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/__init__.py +0 -0
  225. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/base.py +0 -0
  226. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  227. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  228. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  229. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  230. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  231. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  232. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/input/__init__.py +0 -0
  233. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/input/actions.py +0 -0
  234. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/input/run_input.py +0 -0
  235. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/locking/__init__.py +0 -0
  236. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/locking/filesystem.py +0 -0
  237. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/locking/memory.py +0 -0
  238. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/locking/protocol.py +0 -0
  239. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/AGENTS.md +0 -0
  240. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/__init__.py +0 -0
  241. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/clients.py +0 -0
  242. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/configuration.py +0 -0
  243. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/filters.py +0 -0
  244. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/formatters.py +0 -0
  245. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/handlers.py +0 -0
  246. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/highlighters.py +0 -0
  247. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/loggers.py +0 -0
  248. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/logging.yml +0 -0
  249. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/main.py +0 -0
  250. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/plugins.py +0 -0
  251. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/py.typed +0 -0
  252. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/results.py +0 -0
  253. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/AGENTS.md +0 -0
  254. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/__init__.py +0 -0
  255. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_cancellation_manager.py +0 -0
  256. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_deployment_registry.py +0 -0
  257. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_event_emitter.py +0 -0
  258. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_flow_resolver.py +0 -0
  259. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_flow_run_executor.py +0 -0
  260. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_hook_runner.py +0 -0
  261. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_limit_manager.py +0 -0
  262. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_process_manager.py +0 -0
  263. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  264. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_starter_bundle.py +0 -0
  265. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_starter_direct.py +0 -0
  266. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_state_proposer.py +0 -0
  267. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/server.py +0 -0
  268. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/storage.py +0 -0
  269. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runtime/__init__.py +0 -0
  270. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runtime/deployment.py +0 -0
  271. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runtime/flow_run.py +0 -0
  272. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runtime/task_run.py +0 -0
  273. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/schedules.py +0 -0
  274. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/serializers.py +0 -0
  275. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/__init__.py +0 -0
  276. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/admin.py +0 -0
  277. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/artifacts.py +0 -0
  278. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/automations.py +0 -0
  279. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/background_workers.py +0 -0
  280. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
  281. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/block_documents.py +0 -0
  282. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/block_schemas.py +0 -0
  283. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/block_types.py +0 -0
  284. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/clients.py +0 -0
  285. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/collections.py +0 -0
  286. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  287. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
  288. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  289. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/csrf_token.py +0 -0
  290. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/dependencies.py +0 -0
  291. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/deployments.py +0 -0
  292. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/events.py +0 -0
  293. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
  294. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/flow_runs.py +0 -0
  295. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/flows.py +0 -0
  296. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/logs.py +0 -0
  297. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/middleware.py +0 -0
  298. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/root.py +0 -0
  299. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/run_history.py +0 -0
  300. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/saved_searches.py +0 -0
  301. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/server.py +0 -0
  302. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  303. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/task_run_states.py +0 -0
  304. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/task_runs.py +0 -0
  305. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/task_workers.py +0 -0
  306. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/templates.py +0 -0
  307. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
  308. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/flow_runs.py +0 -0
  309. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/flows.py +0 -0
  310. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
  311. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/task_runs.py +0 -0
  312. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/validation.py +0 -0
  313. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/variables.py +0 -0
  314. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/work_queues.py +0 -0
  315. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/workers.py +0 -0
  316. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/AGENTS.md +0 -0
  317. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/__init__.py +0 -0
  318. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/base.py +0 -0
  319. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/constants.py +0 -0
  320. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/context.py +0 -0
  321. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/legacy.py +0 -0
  322. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/__init__.py +0 -0
  323. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/_defaults.py +0 -0
  324. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/api.py +0 -0
  325. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/cli.py +0 -0
  326. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/client.py +0 -0
  327. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/cloud.py +0 -0
  328. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/deployments.py +0 -0
  329. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/events.py +0 -0
  330. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/experiments.py +0 -0
  331. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/flows.py +0 -0
  332. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/internal.py +0 -0
  333. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/logging.py +0 -0
  334. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/results.py +0 -0
  335. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/root.py +0 -0
  336. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/runner.py +0 -0
  337. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
  338. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/api.py +0 -0
  339. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
  340. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/database.py +0 -0
  341. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
  342. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/docket.py +0 -0
  343. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
  344. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/events.py +0 -0
  345. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  346. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/logs.py +0 -0
  347. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/root.py +0 -0
  348. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/services.py +0 -0
  349. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
  350. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/ui.py +0 -0
  351. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/tasks.py +0 -0
  352. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/telemetry.py +0 -0
  353. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/testing.py +0 -0
  354. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/worker.py +0 -0
  355. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/profiles.py +0 -0
  356. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/profiles.toml +0 -0
  357. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/sources.py +0 -0
  358. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/states.py +0 -0
  359. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/task_engine.py +0 -0
  360. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/task_runners.py +0 -0
  361. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/task_runs.py +0 -0
  362. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/task_worker.py +0 -0
  363. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/tasks.py +0 -0
  364. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/telemetry/__init__.py +0 -0
  365. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/telemetry/_metrics.py +0 -0
  366. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
  367. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/transactions.py +0 -0
  368. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/__init__.py +0 -0
  369. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/_concurrency.py +0 -0
  370. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/_schema.py +0 -0
  371. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/entrypoint.py +0 -0
  372. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/names.py +0 -0
  373. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/__init__.py +0 -0
  374. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_ast.py +0 -0
  375. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_deprecated.py +0 -0
  376. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_engine.py +0 -0
  377. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_git.py +0 -0
  378. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
  379. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/annotations.py +0 -0
  380. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/asyncutils.py +0 -0
  381. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/callables.py +0 -0
  382. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/collections.py +0 -0
  383. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/compat.py +0 -0
  384. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/context.py +0 -0
  385. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/dispatch.py +0 -0
  386. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/dockerutils.py +0 -0
  387. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/engine.py +0 -0
  388. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/filesystem.py +0 -0
  389. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/generics.py +0 -0
  390. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/hashing.py +0 -0
  391. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/importtools.py +0 -0
  392. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/math.py +0 -0
  393. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/names.py +0 -0
  394. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/pydantic.py +0 -0
  395. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/render_swagger.py +0 -0
  396. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  397. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  398. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
  399. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/services.py +0 -0
  400. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/slugify.py +0 -0
  401. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/templating.py +0 -0
  402. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/text.py +0 -0
  403. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/timeout.py +0 -0
  404. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/urls.py +0 -0
  405. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/visualization.py +0 -0
  406. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/variables.py +0 -0
  407. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/__init__.py +0 -0
  408. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/block.py +0 -0
  409. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/cloud.py +0 -0
  410. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/server.py +0 -0
  411. {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect-client
3
- Version: 3.6.26.dev5
3
+ Version: 3.6.27.dev1
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io
@@ -61,7 +61,7 @@ Requires-Dist: toml>=0.10.0
61
61
  Requires-Dist: typing-extensions<5.0.0,>=4.10.0
62
62
  Requires-Dist: uvicorn!=0.29.0,>=0.14.0
63
63
  Requires-Dist: websockets<17.0,>=15.0.1
64
- Requires-Dist: whenever<0.10.0,>=0.7.3; python_version >= '3.13'
64
+ Requires-Dist: whenever<0.11.0,>=0.7.3; python_version >= '3.13'
65
65
  Provides-Extra: notifications
66
66
  Requires-Dist: apprise<2.0.0,>=1.1.0; extra == 'notifications'
67
67
  Description-Content-Type: text/markdown
@@ -65,7 +65,7 @@ dependencies = [
65
65
  "typing_extensions>=4.10.0,<5.0.0",
66
66
  "uvicorn>=0.14.0,!=0.29.0",
67
67
  "websockets>=15.0.1,<17.0",
68
- "whenever>=0.7.3,<0.10.0; python_version>='3.13'",
68
+ "whenever>=0.7.3,<0.11.0; python_version>='3.13'",
69
69
  ]
70
70
  [project.urls]
71
71
  Changelog = "https://github.com/PrefectHQ/prefect/releases"
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.6.27.dev1"
3
+ __build_date__ = "2026-04-11 08:17:41.232710+00:00"
4
+ __git_commit__ = "5af4fc87319840e60ce9f6dcc6b10f8e61d78114"
5
+ __dirty__ = False
@@ -0,0 +1,106 @@
1
+ from __future__ import annotations
2
+
3
+ from copy import deepcopy
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ if TYPE_CHECKING:
7
+ from prefect._experimental.bundles import (
8
+ BundleLauncher,
9
+ BundleLauncherOverride,
10
+ BundleLauncherSide,
11
+ )
12
+
13
+
14
+ def validate_bundle_step_launcher(
15
+ launcher: Any, *, field_name: str = "launcher"
16
+ ) -> list[str]:
17
+ if not isinstance(launcher, list) or not launcher:
18
+ raise ValueError(f"{field_name} must be a non-empty list[str]")
19
+
20
+ normalized: list[str] = []
21
+ for i, item in enumerate(launcher):
22
+ if not isinstance(item, str) or not item.strip():
23
+ raise ValueError(f"{field_name}[{i}] must be a non-empty string")
24
+ normalized.append(item)
25
+
26
+ return normalized
27
+
28
+
29
+ def normalize_launcher(
30
+ launcher: BundleLauncher | None,
31
+ ) -> BundleLauncherOverride | None:
32
+ if launcher is None:
33
+ return None
34
+
35
+ if isinstance(launcher, list):
36
+ normalized_launcher = validate_bundle_step_launcher(
37
+ launcher, field_name="launcher"
38
+ )
39
+ return {
40
+ "upload": normalized_launcher.copy(),
41
+ "execution": normalized_launcher.copy(),
42
+ }
43
+
44
+ if not isinstance(launcher, dict):
45
+ raise TypeError(
46
+ "launcher must be a list[str] or a mapping with 'upload'/'execution' keys"
47
+ )
48
+
49
+ allowed_keys = {"upload", "execution"}
50
+ invalid_keys = sorted(set(launcher) - allowed_keys)
51
+ if invalid_keys:
52
+ raise ValueError(
53
+ f"launcher may only specify 'upload' and 'execution'; got {invalid_keys!r}"
54
+ )
55
+
56
+ if not launcher:
57
+ raise ValueError(
58
+ "launcher must specify at least one of 'upload' or 'execution'"
59
+ )
60
+
61
+ normalized: BundleLauncherOverride = {}
62
+ for side in ("upload", "execution"):
63
+ if side in launcher:
64
+ normalized[side] = validate_bundle_step_launcher(
65
+ launcher[side],
66
+ field_name=f"launcher[{side!r}]",
67
+ )
68
+
69
+ return normalized
70
+
71
+
72
+ def get_launcher_for_side(
73
+ launcher: BundleLauncher | None,
74
+ side: BundleLauncherSide,
75
+ ) -> list[str] | None:
76
+ normalized = normalize_launcher(launcher)
77
+ if normalized is None:
78
+ return None
79
+
80
+ launcher = normalized.get(side)
81
+ return launcher.copy() if launcher is not None else None
82
+
83
+
84
+ def resolve_bundle_step_with_launcher(
85
+ step: dict[str, Any],
86
+ launcher: BundleLauncher | None,
87
+ side: BundleLauncherSide,
88
+ ) -> dict[str, Any]:
89
+ resolved_step = deepcopy(step)
90
+ resolved_launcher = get_launcher_for_side(launcher, side)
91
+
92
+ if resolved_launcher is None:
93
+ return resolved_step
94
+
95
+ step_keys = list(resolved_step.keys())
96
+ if len(step_keys) != 1:
97
+ return resolved_step
98
+
99
+ function_args = resolved_step[step_keys[0]]
100
+ if not isinstance(function_args, dict):
101
+ return resolved_step
102
+
103
+ function_args["launcher"] = resolved_launcher
104
+ function_args.pop("requires", None)
105
+
106
+ return resolved_step
@@ -19,7 +19,7 @@ from pathlib import Path
19
19
  from types import ModuleType
20
20
  from typing import Any, TypedDict
21
21
 
22
- from typing_extensions import NotRequired
22
+ from typing_extensions import Literal, NotRequired, TypeAlias
23
23
 
24
24
  import anyio
25
25
  import cloudpickle # pyright: ignore[reportMissingTypeStubs]
@@ -34,11 +34,23 @@ from prefect.settings.context import get_current_settings
34
34
  from prefect.settings.models.root import Settings
35
35
  from prefect.utilities.slugify import slugify
36
36
 
37
+ from prefect._experimental._launchers import validate_bundle_step_launcher
38
+
37
39
  from .execute import execute_bundle_from_file
38
40
  from ._file_collector import FileCollector
39
41
  from ._ignore_filter import IgnoreFilter, check_sensitive_files
40
42
  from ._zip_builder import ZipBuilder
41
43
 
44
+ BundleLauncherSide = Literal["upload", "execution"]
45
+
46
+
47
+ class BundleLauncherOverride(TypedDict, total=False):
48
+ upload: list[str]
49
+ execution: list[str]
50
+
51
+
52
+ BundleLauncher: TypeAlias = list[str] | BundleLauncherOverride
53
+
42
54
  logger: logging.Logger = get_logger(__name__)
43
55
 
44
56
 
@@ -57,6 +69,21 @@ def _get_uv_path() -> str:
57
69
  return "uv"
58
70
 
59
71
 
72
+ def _called_process_error_message(exc: subprocess.CalledProcessError) -> str:
73
+ for stream in (exc.stderr, exc.output):
74
+ if isinstance(stream, bytes):
75
+ message = stream.decode("utf-8", errors="replace").strip()
76
+ elif isinstance(stream, str):
77
+ message = stream.strip()
78
+ else:
79
+ continue
80
+
81
+ if message:
82
+ return message
83
+
84
+ return str(exc)
85
+
86
+
60
87
  class SerializedBundle(TypedDict):
61
88
  """
62
89
  A serialized bundle is a serialized function, context, and flow run that can be
@@ -579,12 +606,6 @@ def convert_step_to_command(
579
606
  Returns:
580
607
  A list of strings representing the command to run the step.
581
608
  """
582
- # Start with uv run
583
- command = ["uv", "run"]
584
-
585
- if quiet:
586
- command.append("--quiet")
587
-
588
609
  step_keys = list(step.keys())
589
610
 
590
611
  if len(step_keys) != 1:
@@ -592,24 +613,38 @@ def convert_step_to_command(
592
613
 
593
614
  function_fqn = step_keys[0]
594
615
  function_args = step[function_fqn]
595
-
596
- # Add the `--with` argument to handle dependencies for running the step
597
616
  requires: list[str] | str = function_args.get("requires", [])
617
+ launcher = function_args.get("launcher")
618
+
598
619
  if isinstance(requires, str):
599
620
  requires = [requires]
600
- if requires:
601
- command.extend(["--with", ",".join(requires)])
602
621
 
603
- # Add the `--python` argument to handle the Python version for running the step
604
- python_version = sys.version_info
605
- command.extend(["--python", f"{python_version.major}.{python_version.minor}"])
622
+ if launcher is not None:
623
+ command = validate_bundle_step_launcher(launcher)
624
+ if requires:
625
+ raise ValueError(
626
+ "Bundle step launcher cannot be combined with step requirements"
627
+ )
628
+ else:
629
+ command = ["uv", "run"]
630
+
631
+ if quiet:
632
+ command.append("--quiet")
633
+
634
+ # Add the `--with` argument to handle dependencies for running the step
635
+ if requires:
636
+ command.extend(["--with", ",".join(requires)])
637
+
638
+ # Add the `--python` argument to handle the Python version for running the step
639
+ python_version = sys.version_info
640
+ command.extend(["--python", f"{python_version.major}.{python_version.minor}"])
606
641
 
607
642
  # Add the `-m` argument to defined the function to run
608
643
  command.extend(["-m", function_fqn])
609
644
 
610
645
  # Add any arguments with values defined in the step
611
646
  for arg_name, arg_value in function_args.items():
612
- if arg_name == "requires":
647
+ if arg_name in {"launcher", "requires"}:
613
648
  continue
614
649
 
615
650
  command.extend([f"--{slugify(arg_name)}", arg_value])
@@ -681,7 +716,7 @@ def upload_bundle_to_storage(
681
716
  )
682
717
 
683
718
  except subprocess.CalledProcessError as e:
684
- raise RuntimeError(e.stderr.decode("utf-8")) from e
719
+ raise RuntimeError(_called_process_error_message(e)) from e
685
720
 
686
721
 
687
722
  async def aupload_bundle_to_storage(
@@ -749,7 +784,7 @@ async def aupload_bundle_to_storage(
749
784
  )
750
785
 
751
786
  except subprocess.CalledProcessError as e:
752
- raise RuntimeError(e.stderr.decode("utf-8")) from e
787
+ raise RuntimeError(_called_process_error_message(e)) from e
753
788
 
754
789
 
755
790
  __all__ = [
@@ -47,6 +47,10 @@ from exceptiongroup import BaseExceptionGroup, ExceptionGroup
47
47
  from rich.console import Console
48
48
  from typing_extensions import Literal, ParamSpec
49
49
 
50
+ from prefect._experimental._launchers import (
51
+ normalize_launcher,
52
+ resolve_bundle_step_with_launcher,
53
+ )
50
54
  from prefect._experimental.sla.objects import SlaTypes
51
55
  from prefect._internal.concurrency.api import create_call, from_async, from_sync
52
56
  from prefect._versioning import VersionType
@@ -96,12 +100,14 @@ from prefect.utilities.collections import listrepr, visit_collection
96
100
  from prefect.utilities.filesystem import relative_path_to_current_platform
97
101
  from prefect.utilities.hashing import file_hash
98
102
  from prefect.utilities.importtools import import_object, safe_load_namespace
103
+ from prefect.utilities.processutils import command_to_string
99
104
 
100
105
  from ._internal.compatibility.async_dispatch import async_dispatch, is_in_async_context
101
106
  from ._internal.pydantic.v2_schema import is_v2_type
102
107
  from ._internal.pydantic.validated_func import ValidatedFunction
103
108
 
104
109
  if TYPE_CHECKING:
110
+ from prefect._experimental.bundles import BundleLauncher, BundleLauncherOverride
105
111
  from prefect.docker.docker_image import DockerImage
106
112
  from prefect.workers.base import BaseWorker
107
113
 
@@ -2276,6 +2282,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
2276
2282
  infrastructure the flow will run on.
2277
2283
  job_variables: Infrastructure configuration that will override the base job
2278
2284
  configuration of the work pool.
2285
+ launcher: Optional upload and execution launcher overrides.
2279
2286
  worker_cls: The class of the worker to use to spin up infrastructure and submit
2280
2287
  the flow to it.
2281
2288
  """
@@ -2286,6 +2293,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
2286
2293
  work_pool: str,
2287
2294
  job_variables: dict[str, Any],
2288
2295
  worker_cls: type["BaseWorker[Any, Any, Any]"],
2296
+ launcher: BundleLauncher | None = None,
2289
2297
  include_files: Sequence[str] | None = None,
2290
2298
  **kwargs: Any,
2291
2299
  ):
@@ -2293,6 +2301,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
2293
2301
  self.work_pool = work_pool
2294
2302
  self.job_variables = job_variables
2295
2303
  self.worker_cls = worker_cls
2304
+ self.launcher: BundleLauncherOverride | None = normalize_launcher(launcher)
2296
2305
  self.include_files: list[str] | None = (
2297
2306
  list(include_files) if include_files is not None else None
2298
2307
  )
@@ -2579,18 +2588,28 @@ class InfrastructureBoundFlow(Flow[P, R]):
2579
2588
  else:
2580
2589
  flow = self
2581
2590
 
2591
+ upload_step = work_pool.storage_configuration.bundle_upload_step
2592
+ execute_step = work_pool.storage_configuration.bundle_execution_step
2593
+ assert upload_step is not None
2594
+ assert execute_step is not None
2595
+
2596
+ upload_step = resolve_bundle_step_with_launcher(
2597
+ upload_step, self.launcher, "upload"
2598
+ )
2599
+ execute_step = resolve_bundle_step_with_launcher(
2600
+ execute_step, self.launcher, "execution"
2601
+ )
2602
+
2582
2603
  bundle_key = str(uuid.uuid4())
2583
2604
  upload_command = convert_step_to_command(
2584
- work_pool.storage_configuration.bundle_upload_step,
2605
+ upload_step,
2585
2606
  bundle_key,
2586
2607
  quiet=True,
2587
2608
  )
2588
- execute_command = convert_step_to_command(
2589
- work_pool.storage_configuration.bundle_execution_step, bundle_key
2590
- )
2609
+ execute_command = convert_step_to_command(execute_step, bundle_key)
2591
2610
 
2592
2611
  job_variables = (self.job_variables or {}) | {
2593
- "command": " ".join(execute_command)
2612
+ "command": command_to_string(execute_command)
2594
2613
  }
2595
2614
 
2596
2615
  # Create a parent task run if this is a child flow run to ensure it shows up as a child flow in the UI
@@ -2625,7 +2644,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
2625
2644
  bundle_key,
2626
2645
  upload_command,
2627
2646
  zip_path=result["zip_path"],
2628
- upload_step=work_pool.storage_configuration.bundle_upload_step,
2647
+ upload_step=upload_step,
2629
2648
  )
2630
2649
 
2631
2650
  # Set flow run to scheduled now that the bundle is uploaded and ready to be executed
@@ -2659,6 +2678,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
2659
2678
  on_crashed: Optional[list[FlowStateHook[P, R]]] = None,
2660
2679
  on_running: Optional[list[FlowStateHook[P, R]]] = None,
2661
2680
  job_variables: Optional[dict[str, Any]] = None,
2681
+ launcher: BundleLauncher | None = NotSet, # type: ignore
2662
2682
  include_files: Optional[list[str]] = NotSet, # type: ignore
2663
2683
  ) -> "InfrastructureBoundFlow[P, R]":
2664
2684
  new_flow = super().with_options(
@@ -2689,6 +2709,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
2689
2709
  job_variables=job_variables
2690
2710
  if job_variables is not None
2691
2711
  else self.job_variables,
2712
+ launcher=launcher if launcher is not NotSet else self.launcher,
2692
2713
  include_files=include_files
2693
2714
  if include_files is not NotSet
2694
2715
  else self.include_files,
@@ -2701,6 +2722,7 @@ def bind_flow_to_infrastructure(
2701
2722
  work_pool: str,
2702
2723
  worker_cls: type["BaseWorker[Any, Any, Any]"],
2703
2724
  job_variables: dict[str, Any] | None = None,
2725
+ launcher: BundleLauncher | None = None,
2704
2726
  include_files: Sequence[str] | None = None,
2705
2727
  ) -> InfrastructureBoundFlow[P, R]:
2706
2728
  new = InfrastructureBoundFlow[P, R](
@@ -2708,11 +2730,17 @@ def bind_flow_to_infrastructure(
2708
2730
  work_pool=work_pool,
2709
2731
  job_variables=job_variables or {},
2710
2732
  worker_cls=worker_cls,
2733
+ launcher=launcher,
2711
2734
  include_files=include_files,
2712
2735
  )
2713
2736
  # Copy all attributes from the original flow
2714
2737
  for attr, value in flow.__dict__.items():
2715
2738
  setattr(new, attr, value)
2739
+ new.work_pool = work_pool
2740
+ new.job_variables = job_variables or {}
2741
+ new.worker_cls = worker_cls
2742
+ new.launcher = normalize_launcher(launcher)
2743
+ new.include_files = list(include_files) if include_files is not None else None
2716
2744
  return new
2717
2745
 
2718
2746
 
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import os
4
- import shlex
5
4
  import subprocess
6
5
  import sys
7
6
  from pathlib import Path
@@ -12,7 +11,11 @@ import anyio.abc
12
11
 
13
12
  from prefect.runner._process_manager import ProcessHandle
14
13
  from prefect.settings import get_current_settings
15
- from prefect.utilities.processutils import get_sys_executable, run_process
14
+ from prefect.utilities.processutils import (
15
+ command_from_string,
16
+ get_sys_executable,
17
+ run_process,
18
+ )
16
19
 
17
20
  if TYPE_CHECKING:
18
21
  from prefect.client.schemas.objects import FlowRun
@@ -59,7 +62,7 @@ class EngineCommandStarter:
59
62
  if self._command is None:
60
63
  runner_command = [get_sys_executable(), "-m", "prefect.engine"]
61
64
  else:
62
- runner_command = shlex.split(self._command, posix=(os.name != "nt"))
65
+ runner_command = command_from_string(self._command)
63
66
 
64
67
  # We must add creationflags to a dict so it is only passed as a
65
68
  # function parameter on Windows, because the presence of
@@ -39,7 +39,6 @@ import datetime
39
39
  import logging
40
40
  import multiprocessing.context
41
41
  import os
42
- import shlex
43
42
  import shutil
44
43
  import signal
45
44
  import subprocess
@@ -135,6 +134,7 @@ from prefect.utilities.engine import ( # noqa: F401 (patch target)
135
134
  propose_state_sync,
136
135
  )
137
136
  from prefect.utilities.processutils import (
137
+ command_from_string,
138
138
  get_sys_executable,
139
139
  run_process,
140
140
  )
@@ -900,7 +900,7 @@ class Runner:
900
900
  if command is None:
901
901
  runner_command = [get_sys_executable(), "-m", "prefect.engine"]
902
902
  else:
903
- runner_command = shlex.split(command, posix=(os.name != "nt"))
903
+ runner_command = command_from_string(command)
904
904
 
905
905
  flow_run_logger = self._get_flow_run_logger(flow_run)
906
906
 
@@ -124,7 +124,14 @@ def now(
124
124
  if isinstance(getattr(tz, "name", None), str):
125
125
  tz = tz.name
126
126
 
127
- return ZonedDateTime.now(tz).py_datetime()
127
+ zoned_datetime = ZonedDateTime.now(tz)
128
+
129
+ # `whenever` is deprecating `py_datetime()` in favor of `to_stdlib()`,
130
+ # but older releases in our supported range do not expose `to_stdlib()`.
131
+ if callable(to_stdlib := getattr(zoned_datetime, "to_stdlib", None)):
132
+ return to_stdlib()
133
+
134
+ return zoned_datetime.py_datetime()
128
135
  else:
129
136
  return pendulum.now(tz)
130
137
 
@@ -15,7 +15,7 @@ Does NOT include: server-specific utilities (`server/utilities/`), concurrency s
15
15
  - `callables.py` — Function signature introspection and parameter coercion
16
16
  - `collections.py` — Extended collection helpers (visit, flatten, remove nested keys)
17
17
  - `annotations.py` — Custom Prefect type annotations used in flow/task signatures
18
- - `processutils.py` — Subprocess execution and output streaming helpers (`run_process`, `consume_process_output`, `stream_text`)
18
+ - `processutils.py` — Subprocess execution, output streaming, and command serialization helpers (`run_process`, `consume_process_output`, `stream_text`, `command_to_string`, `command_from_string`)
19
19
  - `pydantic.py` — Pydantic v1/v2 compatibility shims
20
20
  - `templating.py` — Jinja template utilities and `maybe_template()` detection
21
21
  - `filesystem.py` — File filtering (`filter_files`), path normalization, and `tmpchdir` context manager
@@ -77,3 +77,5 @@ Handlers return `Placeholder` subclasses (e.g. `RemoveValue`, `InvalidJSON`, `In
77
77
  - **Passing the same key in both an explicit parameter and a `**kwargs` dict raises `TypeError`.** `parameters_to_args_kwargs` detects when a VAR_KEYWORD (`**kwargs`) dict contains a key that also appears as an explicit parameter and raises rather than silently letting the variadic entry win. Exception: POSITIONAL_ONLY parameters are exempt because `fn(1, **{'a': 2})` is legal when `a` is positional-only.
78
78
  - **`filter_files` with `include_dirs=True` (the default) always includes all ancestor directories of matched files**, even if those directories weren't directly matched by the ignore patterns. This ensures `shutil.copytree`'s `ignore_func` doesn't skip directories containing files that should be copied. Side effect: callers expecting only pathspec-matched entries will receive additional directory paths. The parent-dir expansion does NOT run when `include_dirs=False`.
79
79
  - **Never access `EngineContext.run_results` directly via `id(obj)`.** Always call `get_state_for_result(obj)`.
80
+ - **`command_to_string` always uses POSIX quoting (`shlex.join`), even on Windows.** This is intentional for platform-neutral storage — bundle commands are serialized by one platform and may be deserialized by another. `command_from_string` uses a dual-path approach: if the string was POSIX-serialized by Prefect (round-trips cleanly through `shlex.split`/`shlex.join`), it uses POSIX parsing; otherwise it falls back to native Windows command-line parsing (`CommandLineToArgvW`). Do not use `" ".join(command)` or `shlex.split(command)` directly when working with stored Prefect commands — use these helpers instead.
81
+ - **`get_sys_executable()` no longer quotes the Python path on Windows.** It previously returned `'"path/to/python"'` (with embedded quotes) on Windows; now it returns the raw path. Code relying on the old quoted form (e.g., joining into a shell string) will break — use `subprocess.list2cmdline` or `command_to_string` for shell-safe serialization instead.
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import os
3
+ import shlex
3
4
  import signal
4
5
  import subprocess
5
6
  import sys
@@ -35,9 +36,24 @@ PrintFn: TypeAlias = Callable[[str], object]
35
36
  T = TypeVar("T", infer_variance=True)
36
37
 
37
38
  if sys.platform == "win32":
38
- from ctypes import WINFUNCTYPE, c_int, c_uint, windll
39
+ from ctypes import (
40
+ POINTER,
41
+ WINFUNCTYPE,
42
+ byref,
43
+ c_int,
44
+ c_uint,
45
+ c_void_p,
46
+ c_wchar_p,
47
+ windll,
48
+ )
39
49
 
40
50
  _windows_process_group_pids = set()
51
+ _command_line_to_argv = windll.shell32.CommandLineToArgvW
52
+ _command_line_to_argv.argtypes = [c_wchar_p, POINTER(c_int)]
53
+ _command_line_to_argv.restype = POINTER(c_wchar_p)
54
+ _local_free = windll.kernel32.LocalFree
55
+ _local_free.argtypes = [c_void_p]
56
+ _local_free.restype = c_void_p
41
57
 
42
58
  @WINFUNCTYPE(c_int, c_uint)
43
59
  def _win32_ctrl_handler(dwCtrlType: object) -> int:
@@ -185,6 +201,65 @@ if sys.platform == "win32":
185
201
  )
186
202
 
187
203
 
204
+ def _parse_prefect_serialized_command(command: str) -> list[str] | None:
205
+ """Return argv for strings produced by `command_to_string`, if any."""
206
+ try:
207
+ parts = shlex.split(command, posix=True)
208
+ except ValueError:
209
+ return None
210
+
211
+ if shlex.join(parts) != command:
212
+ return None
213
+
214
+ return parts
215
+
216
+
217
+ if sys.platform == "win32":
218
+
219
+ def _split_windows_command_string(command: str) -> list[str]:
220
+ argc = c_int(0)
221
+ argv = _command_line_to_argv(c_wchar_p(command), byref(argc))
222
+ if not argv:
223
+ raise OSError("CommandLineToArgvW failed to parse command string.")
224
+ try:
225
+ return [argv[index] for index in range(argc.value)]
226
+ finally:
227
+ _local_free(argv)
228
+
229
+ else:
230
+
231
+ def _split_windows_command_string(command: str) -> list[str]:
232
+ # Preserve pre-existing behavior for local tests on non-Windows hosts.
233
+ return shlex.split(command, posix=False)
234
+
235
+
236
+ def command_to_string(command: list[str]) -> str:
237
+ """
238
+ Serialize a command list to a platform-neutral string.
239
+
240
+ We use POSIX shell quoting so stored commands round-trip across platforms
241
+ when paired with `command_from_string`.
242
+ """
243
+ return shlex.join(command)
244
+
245
+
246
+ def command_from_string(command: str) -> list[str]:
247
+ """
248
+ Parse a command string back into argv tokens.
249
+
250
+ Prefect-owned command strings use POSIX shell quoting. Other command
251
+ strings keep native parsing so existing Windows configuration still works.
252
+ """
253
+ serialized_command = _parse_prefect_serialized_command(command)
254
+ if serialized_command is not None:
255
+ return serialized_command
256
+
257
+ if sys.platform == "win32":
258
+ return _split_windows_command_string(command)
259
+
260
+ return shlex.split(command, posix=True)
261
+
262
+
188
263
  @asynccontextmanager
189
264
  async def open_process(
190
265
  command: list[str], **kwargs: Any
@@ -206,7 +281,7 @@ async def open_process(
206
281
  )
207
282
 
208
283
  if sys.platform == "win32":
209
- command = " ".join(command)
284
+ command = subprocess.list2cmdline(command)
210
285
  process = await _open_anyio_process(command, **kwargs)
211
286
  else:
212
287
  process = await anyio.open_process(command, **kwargs)
@@ -473,10 +548,4 @@ def setup_signal_handlers_worker(
473
548
 
474
549
 
475
550
  def get_sys_executable() -> str:
476
- # python executable needs to be quotable on windows
477
- if os.name == "nt":
478
- executable_path = f'"{sys.executable}"'
479
- else:
480
- executable_path = sys.executable
481
-
482
- return executable_path
551
+ return sys.executable
@@ -26,6 +26,14 @@ Workers stamp two env vars into `os.environ` for their own process, so all API r
26
26
 
27
27
  These are separate from the per-flow-run attribution vars injected into the child process environment by `prepare_for_flow_run(worker_name=..., worker_id=...)`.
28
28
 
29
+ ## Bundle Launcher Override
30
+
31
+ When a flow is decorated with an infrastructure decorator (`@docker`, `@ecs`, `@kubernetes`, etc.) and a `launcher` argument is supplied, `InfrastructureBoundFlow` stores a normalized `BundleLauncherOverride` on `flow.launcher`. `BaseWorker.submit()` extracts this via `getattr(flow, "launcher", None)` and calls `resolve_bundle_step_with_launcher(step, launcher, side)` before converting steps to commands.
32
+
33
+ **Non-obvious:** the launcher replaces the `uv run ...` prefix entirely. With a launcher, the resulting command is `[*launcher, "-m", "<module>", "--key", "<path>"]` rather than `["uv", "run", "--with", "...", "--python", "X.Y", "-m", "<module>", "--key", "<path>"]`. Launchers and `requires` are mutually exclusive — `convert_step_to_command` raises `ValueError` if a step has both.
34
+
35
+ Work-pool-level launchers are configured via `prefect work-pool storage configure s3|gcs|azure --launcher <executable>` and are stored in the step dict itself. Flow-level launchers (via the decorator) are resolved at submit time and win over the work-pool step configuration.
36
+
29
37
  ## Anti-Patterns
30
38
 
31
39
  - Do not set `PREFECT__WORKER_NAME` / `PREFECT__WORKER_ID` in `os.environ` from outside `BaseWorker` — setup/teardown own this lifecycle.