prefect-client 3.6.27.dev2__tar.gz → 3.6.27.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 (416) hide show
  1. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/PKG-INFO +1 -1
  2. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/AGENTS.md +1 -0
  3. prefect_client-3.6.27.dev4/src/prefect/_build_info.py +5 -0
  4. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/bundles/__init__.py +18 -7
  5. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/bundles/execute.py +4 -1
  6. prefect_client-3.6.27.dev4/src/prefect/_internal/control_listener.py +223 -0
  7. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_states.py +10 -1
  8. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/runner.py +28 -12
  9. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/engine.py +66 -13
  10. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/flow_engine.py +238 -37
  11. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/AGENTS.md +24 -1
  12. prefect_client-3.6.27.dev4/src/prefect/runner/_cancel_finalizer.py +111 -0
  13. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_cancellation_manager.py +98 -9
  14. prefect_client-3.6.27.dev4/src/prefect/runner/_control_channel.py +388 -0
  15. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_flow_run_executor.py +12 -0
  16. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_process_manager.py +87 -1
  17. prefect_client-3.6.27.dev4/src/prefect/runner/_starter_bundle.py +75 -0
  18. prefect_client-3.6.27.dev4/src/prefect/runner/_starter_direct.py +72 -0
  19. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_starter_engine.py +48 -12
  20. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_state_proposer.py +7 -3
  21. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/runner.py +239 -33
  22. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/storage.py +17 -13
  23. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/engine.py +166 -12
  24. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/processutils.py +17 -0
  25. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/workers/process.py +3 -2
  26. prefect_client-3.6.27.dev2/src/prefect/_build_info.py +0 -5
  27. prefect_client-3.6.27.dev2/src/prefect/runner/_starter_bundle.py +0 -52
  28. prefect_client-3.6.27.dev2/src/prefect/runner/_starter_direct.py +0 -50
  29. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/.gitignore +0 -0
  30. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/LICENSE +0 -0
  31. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/README.md +0 -0
  32. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/pyproject.toml +0 -0
  33. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/.prefectignore +0 -0
  34. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/__init__.py +0 -0
  35. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/__main__.py +0 -0
  36. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/__init__.py +0 -0
  37. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/_launchers.py +0 -0
  38. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
  39. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
  40. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
  41. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
  42. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
  43. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/plugins/__init__.py +0 -0
  44. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/plugins/apply.py +0 -0
  45. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  46. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/plugins/manager.py +0 -0
  47. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/plugins/spec.py +0 -0
  48. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/sla/__init__.py +0 -0
  49. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/sla/client.py +0 -0
  50. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_experimental/sla/objects.py +0 -0
  51. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/__init__.py +0 -0
  52. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/_logging.py +0 -0
  53. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/__init__.py +0 -0
  54. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  55. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/client.py +0 -0
  56. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/device_id.py +0 -0
  57. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/emit.py +0 -0
  58. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/enabled.py +0 -0
  59. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/events.py +0 -0
  60. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/milestones.py +0 -0
  61. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/notice.py +0 -0
  62. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/analytics/service.py +0 -0
  63. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/compatibility/__init__.py +0 -0
  64. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  65. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/compatibility/backports.py +0 -0
  66. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/compatibility/blocks.py +0 -0
  67. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  68. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/compatibility/migration.py +0 -0
  69. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/compatibility/starlette.py +0 -0
  70. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/__init__.py +0 -0
  71. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/api.py +0 -0
  72. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/calls.py +0 -0
  73. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  74. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  75. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/inspection.py +0 -0
  76. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/primitives.py +0 -0
  77. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/services.py +0 -0
  78. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/threads.py +0 -0
  79. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/concurrency/waiters.py +0 -0
  80. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/installation.py +0 -0
  81. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/integrations.py +0 -0
  82. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/lazy.py +0 -0
  83. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/observability.py +0 -0
  84. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/pydantic/__init__.py +0 -0
  85. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/pydantic/schemas.py +0 -0
  86. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  87. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  88. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  89. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/pytz.py +0 -0
  90. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/retries.py +0 -0
  91. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/schemas/__init__.py +0 -0
  92. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/schemas/bases.py +0 -0
  93. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/schemas/fields.py +0 -0
  94. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/schemas/serializers.py +0 -0
  95. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/schemas/validators.py +0 -0
  96. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  97. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/testing.py +0 -0
  98. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/urls.py +0 -0
  99. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/uuid7.py +0 -0
  100. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_internal/websockets.py +0 -0
  101. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_observers.py +0 -0
  102. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_result_records.py +0 -0
  103. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/__init__.py +0 -0
  104. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/fetcher.py +0 -0
  105. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/generator.py +0 -0
  106. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/models.py +0 -0
  107. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/naming.py +0 -0
  108. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/renderer.py +0 -0
  109. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/schema_converter.py +0 -0
  110. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/templates/__init__.py +0 -0
  111. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  112. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/types.py +0 -0
  113. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_sdk/unions.py +0 -0
  114. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_vendor/croniter/__init__.py +0 -0
  115. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_vendor/croniter/croniter.py +0 -0
  116. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_versioning.py +0 -0
  117. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/_waiters.py +0 -0
  118. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/agent.py +0 -0
  119. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/analytics/__init__.py +0 -0
  120. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/artifacts.py +0 -0
  121. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/assets/__init__.py +0 -0
  122. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/assets/core.py +0 -0
  123. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/assets/materialize.py +0 -0
  124. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/automations.py +0 -0
  125. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/AGENTS.md +0 -0
  126. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/__init__.py +0 -0
  127. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/abstract.py +0 -0
  128. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/core.py +0 -0
  129. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/fields.py +0 -0
  130. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/notifications.py +0 -0
  131. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/redis.py +0 -0
  132. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/system.py +0 -0
  133. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/blocks/webhook.py +0 -0
  134. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/cache_policies.py +0 -0
  135. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/AGENTS.md +0 -0
  136. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/__init__.py +0 -0
  137. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/_version_checking.py +0 -0
  138. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/attribution.py +0 -0
  139. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/base.py +0 -0
  140. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/cloud.py +0 -0
  141. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/collections.py +0 -0
  142. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/constants.py +0 -0
  143. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/__init__.py +0 -0
  144. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  145. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  146. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  147. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_automations/client.py +0 -0
  148. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  149. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  150. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  151. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  152. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  153. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  154. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  155. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  156. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  157. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  158. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  159. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_events/client.py +0 -0
  160. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  161. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  162. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  163. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_flows/client.py +0 -0
  164. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  165. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_logs/client.py +0 -0
  166. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  167. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_variables/client.py +0 -0
  168. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  169. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  170. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/base.py +0 -0
  171. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/orchestration/routes.py +0 -0
  172. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/schemas/__init__.py +0 -0
  173. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/schemas/actions.py +0 -0
  174. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/schemas/events.py +0 -0
  175. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/schemas/filters.py +0 -0
  176. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/schemas/objects.py +0 -0
  177. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/schemas/responses.py +0 -0
  178. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/schemas/schedules.py +0 -0
  179. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/schemas/sorting.py +0 -0
  180. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/subscriptions.py +0 -0
  181. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/types/__init__.py +0 -0
  182. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  183. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/client/utilities.py +0 -0
  184. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/AGENTS.md +0 -0
  185. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/__init__.py +0 -0
  186. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/_asyncio.py +0 -0
  187. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/_events.py +0 -0
  188. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/_leases.py +0 -0
  189. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/_sync.py +0 -0
  190. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/asyncio.py +0 -0
  191. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/context.py +0 -0
  192. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/services.py +0 -0
  193. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/sync.py +0 -0
  194. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/v1/__init__.py +0 -0
  195. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  196. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/v1/_events.py +0 -0
  197. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/v1/asyncio.py +0 -0
  198. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/v1/context.py +0 -0
  199. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/v1/services.py +0 -0
  200. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/concurrency/v1/sync.py +0 -0
  201. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/context.py +0 -0
  202. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/AGENTS.md +0 -0
  203. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/__init__.py +0 -0
  204. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/base.py +0 -0
  205. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/deployments.py +0 -0
  206. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/flow_runs.py +0 -0
  207. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/schedules.py +0 -0
  208. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/steps/__init__.py +0 -0
  209. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/steps/core.py +0 -0
  210. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/steps/pull.py +0 -0
  211. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/deployments/steps/utility.py +0 -0
  212. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/docker/__init__.py +0 -0
  213. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/docker/_buildx.py +0 -0
  214. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/docker/docker_image.py +0 -0
  215. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/AGENTS.md +0 -0
  216. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/__init__.py +0 -0
  217. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/actions.py +0 -0
  218. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/clients.py +0 -0
  219. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/filters.py +0 -0
  220. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/related.py +0 -0
  221. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/schemas/__init__.py +0 -0
  222. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/schemas/automations.py +0 -0
  223. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  224. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/schemas/events.py +0 -0
  225. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/schemas/labelling.py +0 -0
  226. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/subscribers.py +0 -0
  227. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/utilities.py +0 -0
  228. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/events/worker.py +0 -0
  229. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/exceptions.py +0 -0
  230. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/filesystems.py +0 -0
  231. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/flow_runs.py +0 -0
  232. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/flows.py +0 -0
  233. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/futures.py +0 -0
  234. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/infrastructure/__init__.py +0 -0
  235. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/infrastructure/base.py +0 -0
  236. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  237. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  238. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  239. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  240. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  241. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  242. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/input/__init__.py +0 -0
  243. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/input/actions.py +0 -0
  244. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/input/run_input.py +0 -0
  245. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/locking/__init__.py +0 -0
  246. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/locking/filesystem.py +0 -0
  247. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/locking/memory.py +0 -0
  248. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/locking/protocol.py +0 -0
  249. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/AGENTS.md +0 -0
  250. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/__init__.py +0 -0
  251. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/clients.py +0 -0
  252. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/configuration.py +0 -0
  253. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/filters.py +0 -0
  254. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/formatters.py +0 -0
  255. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/handlers.py +0 -0
  256. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/highlighters.py +0 -0
  257. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/loggers.py +0 -0
  258. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/logging/logging.yml +0 -0
  259. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/main.py +0 -0
  260. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/plugins.py +0 -0
  261. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/py.typed +0 -0
  262. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/results.py +0 -0
  263. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/__init__.py +0 -0
  264. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_deployment_registry.py +0 -0
  265. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_event_emitter.py +0 -0
  266. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_flow_resolver.py +0 -0
  267. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_hook_runner.py +0 -0
  268. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_limit_manager.py +0 -0
  269. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  270. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runner/server.py +0 -0
  271. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runtime/__init__.py +0 -0
  272. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runtime/deployment.py +0 -0
  273. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runtime/flow_run.py +0 -0
  274. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/runtime/task_run.py +0 -0
  275. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/schedules.py +0 -0
  276. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/serializers.py +0 -0
  277. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/__init__.py +0 -0
  278. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/admin.py +0 -0
  279. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/artifacts.py +0 -0
  280. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/automations.py +0 -0
  281. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/background_workers.py +0 -0
  282. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/block_capabilities.py +0 -0
  283. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/block_documents.py +0 -0
  284. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/block_schemas.py +0 -0
  285. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/block_types.py +0 -0
  286. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/clients.py +0 -0
  287. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/collections.py +0 -0
  288. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  289. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/concurrency_limits.py +0 -0
  290. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  291. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/csrf_token.py +0 -0
  292. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/dependencies.py +0 -0
  293. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/deployments.py +0 -0
  294. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/events.py +0 -0
  295. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/flow_run_states.py +0 -0
  296. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/flow_runs.py +0 -0
  297. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/flows.py +0 -0
  298. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/logs.py +0 -0
  299. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/middleware.py +0 -0
  300. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/root.py +0 -0
  301. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/run_history.py +0 -0
  302. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/saved_searches.py +0 -0
  303. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/server.py +0 -0
  304. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  305. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/task_run_states.py +0 -0
  306. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/task_runs.py +0 -0
  307. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/task_workers.py +0 -0
  308. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/templates.py +0 -0
  309. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/ui/__init__.py +0 -0
  310. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/ui/flow_runs.py +0 -0
  311. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/ui/flows.py +0 -0
  312. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/ui/schemas.py +0 -0
  313. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/ui/task_runs.py +0 -0
  314. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/validation.py +0 -0
  315. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/variables.py +0 -0
  316. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/work_queues.py +0 -0
  317. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/server/api/workers.py +0 -0
  318. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/AGENTS.md +0 -0
  319. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/__init__.py +0 -0
  320. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/base.py +0 -0
  321. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/constants.py +0 -0
  322. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/context.py +0 -0
  323. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/legacy.py +0 -0
  324. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/__init__.py +0 -0
  325. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/_defaults.py +0 -0
  326. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/api.py +0 -0
  327. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/cli.py +0 -0
  328. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/client.py +0 -0
  329. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/cloud.py +0 -0
  330. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/deployments.py +0 -0
  331. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/events.py +0 -0
  332. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/experiments.py +0 -0
  333. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/flows.py +0 -0
  334. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/internal.py +0 -0
  335. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/logging.py +0 -0
  336. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/results.py +0 -0
  337. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/root.py +0 -0
  338. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/runner.py +0 -0
  339. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/__init__.py +0 -0
  340. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/api.py +0 -0
  341. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/concurrency.py +0 -0
  342. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/database.py +0 -0
  343. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/deployments.py +0 -0
  344. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/docket.py +0 -0
  345. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/ephemeral.py +0 -0
  346. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/events.py +0 -0
  347. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  348. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/logs.py +0 -0
  349. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/root.py +0 -0
  350. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/services.py +0 -0
  351. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/tasks.py +0 -0
  352. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/server/ui.py +0 -0
  353. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/tasks.py +0 -0
  354. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/telemetry.py +0 -0
  355. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/testing.py +0 -0
  356. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/models/worker.py +0 -0
  357. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/profiles.py +0 -0
  358. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/profiles.toml +0 -0
  359. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/settings/sources.py +0 -0
  360. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/states.py +0 -0
  361. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/task_engine.py +0 -0
  362. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/task_runners.py +0 -0
  363. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/task_runs.py +0 -0
  364. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/task_worker.py +0 -0
  365. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/tasks.py +0 -0
  366. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/telemetry/__init__.py +0 -0
  367. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/telemetry/_metrics.py +0 -0
  368. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/telemetry/run_telemetry.py +0 -0
  369. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/transactions.py +0 -0
  370. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/types/__init__.py +0 -0
  371. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/types/_concurrency.py +0 -0
  372. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/types/_datetime.py +0 -0
  373. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/types/_schema.py +0 -0
  374. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/types/entrypoint.py +0 -0
  375. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/types/names.py +0 -0
  376. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/AGENTS.md +0 -0
  377. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/__init__.py +0 -0
  378. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/_ast.py +0 -0
  379. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/_deprecated.py +0 -0
  380. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/_engine.py +0 -0
  381. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/_git.py +0 -0
  382. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
  383. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/annotations.py +0 -0
  384. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/asyncutils.py +0 -0
  385. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/callables.py +0 -0
  386. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/collections.py +0 -0
  387. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/compat.py +0 -0
  388. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/context.py +0 -0
  389. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/dispatch.py +0 -0
  390. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/dockerutils.py +0 -0
  391. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/filesystem.py +0 -0
  392. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/generics.py +0 -0
  393. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/hashing.py +0 -0
  394. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/importtools.py +0 -0
  395. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/math.py +0 -0
  396. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/names.py +0 -0
  397. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/pydantic.py +0 -0
  398. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/render_swagger.py +0 -0
  399. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  400. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  401. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/schema_tools/validation.py +0 -0
  402. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/services.py +0 -0
  403. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/slugify.py +0 -0
  404. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/templating.py +0 -0
  405. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/text.py +0 -0
  406. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/timeout.py +0 -0
  407. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/urls.py +0 -0
  408. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/utilities/visualization.py +0 -0
  409. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/variables.py +0 -0
  410. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/workers/AGENTS.md +0 -0
  411. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/workers/__init__.py +0 -0
  412. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/workers/base.py +0 -0
  413. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/workers/block.py +0 -0
  414. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/workers/cloud.py +0 -0
  415. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.dev4}/src/prefect/workers/server.py +0 -0
  416. {prefect_client-3.6.27.dev2 → prefect_client-3.6.27.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.27.dev2
3
+ Version: 3.6.27.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
@@ -54,3 +54,4 @@ Use `get_logger()` from `prefect.logging` instead of raw `logging.getLogger()`
54
54
  - `workers/` → Work-pool-based execution layer: polls for flow runs, dispatches to infrastructure (see workers/AGENTS.md)
55
55
  - `docker/` → `DockerImage` class for building and pushing Docker images during deployment
56
56
  - `telemetry/` → OS-level resource metric collection and run telemetry
57
+ - `testing/` → Test utilities shipped with the SDK: `prefect_test_harness`, assertion helpers, and reusable fixtures (see testing/AGENTS.md)
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.6.27.dev4"
3
+ __build_date__ = "2026-04-16 08:40:58.203919+00:00"
4
+ __git_commit__ = "08aeda82f675d686e68b1f6a53fe10ad5aac48da"
5
+ __dirty__ = False
@@ -24,6 +24,7 @@ from typing_extensions import Literal, NotRequired, TypeAlias
24
24
  import anyio
25
25
  import cloudpickle # pyright: ignore[reportMissingTypeStubs]
26
26
 
27
+ from prefect._internal.control_listener import configure_from_env
27
28
  from prefect.client.schemas.objects import FlowRun
28
29
  from prefect.context import SettingsContext, get_settings_context, serialize_context
29
30
  from prefect.engine import handle_engine_signals
@@ -32,6 +33,7 @@ from prefect.flows import Flow
32
33
  from prefect.logging import get_logger
33
34
  from prefect.settings.context import get_current_settings
34
35
  from prefect.settings.models.root import Settings
36
+ from prefect.utilities.processutils import sanitize_subprocess_env
35
37
  from prefect.utilities.slugify import slugify
36
38
 
37
39
  from prefect._experimental._launchers import validate_bundle_step_launcher
@@ -509,7 +511,7 @@ def extract_flow_from_bundle(bundle: SerializedBundle) -> Flow[Any, Any]:
509
511
  def _extract_and_run_flow(
510
512
  bundle: SerializedBundle,
511
513
  cwd: Path | str | None = None,
512
- env: dict[str, Any] | None = None,
514
+ env: dict[str, str | None] | None = None,
513
515
  ) -> None:
514
516
  """
515
517
  Extracts a flow from a bundle and runs it.
@@ -522,14 +524,20 @@ def _extract_and_run_flow(
522
524
  env: The environment to use when running the flow.
523
525
  """
524
526
 
525
- os.environ.update(env or {})
527
+ os.environ.update(sanitize_subprocess_env(env))
526
528
  # TODO: make this a thing we can pass directly to the engine
527
529
  os.environ["PREFECT__ENABLE_CANCELLATION_AND_CRASHED_HOOKS"] = "false"
528
530
  settings_context = get_settings_context()
531
+ flow_run = FlowRun.model_validate(bundle["flow_run"])
532
+
533
+ # Consume the runner control-channel bootstrap env before deserializing
534
+ # bundled function/context objects, but do not connect yet. The actual
535
+ # listener socket is only opened while `capture_sigterm()` is active
536
+ # inside the flow engine.
537
+ configure_from_env()
529
538
 
530
539
  flow = _deserialize_bundle_object(bundle["function"])
531
540
  context = _deserialize_bundle_object(bundle["context"])
532
- flow_run = FlowRun.model_validate(bundle["flow_run"])
533
541
 
534
542
  if cwd:
535
543
  os.chdir(cwd)
@@ -552,7 +560,7 @@ def _extract_and_run_flow(
552
560
 
553
561
  def execute_bundle_in_subprocess(
554
562
  bundle: SerializedBundle,
555
- env: dict[str, Any] | None = None,
563
+ env: dict[str, str | None] | None = None,
556
564
  cwd: Path | str | None = None,
557
565
  ) -> multiprocessing.context.SpawnProcess:
558
566
  """
@@ -576,13 +584,16 @@ def execute_bundle_in_subprocess(
576
584
  env=os.environ,
577
585
  )
578
586
 
587
+ subprocess_env = sanitize_subprocess_env(
588
+ get_current_settings().to_environment_variables(exclude_unset=True)
589
+ | os.environ
590
+ | env
591
+ )
579
592
  process = ctx.Process(
580
593
  target=_extract_and_run_flow,
581
594
  kwargs={
582
595
  "bundle": bundle,
583
- "env": get_current_settings().to_environment_variables(exclude_unset=True)
584
- | os.environ
585
- | env,
596
+ "env": subprocess_env,
586
597
  "cwd": cwd,
587
598
  },
588
599
  )
@@ -34,7 +34,10 @@ async def execute_bundle(bundle: dict) -> None:
34
34
  flow_run = FlowRun.model_validate(bundle["flow_run"])
35
35
  executor = ctx.create_executor(
36
36
  flow_run,
37
- BundleExecutionStarter(bundle=bundle),
37
+ BundleExecutionStarter(
38
+ bundle=bundle,
39
+ control_channel=ctx.control_channel,
40
+ ),
38
41
  resolve_flow=resolve_flow,
39
42
  )
40
43
  await executor.submit()
@@ -0,0 +1,223 @@
1
+ """
2
+ Child-process runner-control intent listener.
3
+
4
+ This module is intentionally small. It only supports steady-state graceful
5
+ control delivery after Prefect has already installed its SIGTERM bridge via
6
+ `capture_sigterm()`.
7
+
8
+ Protocol:
9
+
10
+ 1. The runner injects `PREFECT__CONTROL_PORT` and `PREFECT__CONTROL_TOKEN`
11
+ into the child environment.
12
+ 2. Process entrypoints call `configure_from_env()` early to consume those
13
+ one-shot env vars without connecting yet.
14
+ 3. The outermost `capture_sigterm()` calls `start()`, which connects back to
15
+ the runner and spawns a daemon thread blocked on the socket.
16
+ 4. The runner writes a single-byte intent (`b"c"` today).
17
+ 5. If Prefect still owns the live SIGTERM bridge, the child writes `b"a"`,
18
+ commits the intent for engine dispatch, and on Windows triggers
19
+ `_thread.interrupt_main(SIGTERM)`.
20
+ 6. The runner then sends its normal external termination signal. On POSIX,
21
+ that real `SIGTERM` is the only trigger that interrupts blocking code.
22
+
23
+ If the child is not connected yet, or can no longer safely acknowledge the
24
+ intent, the runner sees no ack and falls back to its existing crash-style
25
+ termination path. There is deliberately no startup-time graceful cancellation
26
+ contract in this implementation.
27
+ """
28
+
29
+ from __future__ import annotations
30
+
31
+ import _thread
32
+ import os
33
+ import signal
34
+ import socket
35
+ import threading
36
+ from typing import Literal
37
+
38
+ from prefect.utilities.engine import commit_control_intent_and_ack
39
+
40
+ Intent = Literal["cancel"]
41
+
42
+ _INTENT_FOR_BYTE: dict[bytes, Intent] = {
43
+ b"c": "cancel",
44
+ }
45
+
46
+ _intent: Intent | None = None
47
+ _intent_lock = threading.Lock()
48
+
49
+ _configured = False
50
+ _configured_port: int | None = None
51
+ _configured_token: str | None = None
52
+
53
+ _started = False
54
+ _started_lock = threading.Lock()
55
+ _socket: socket.socket | None = None
56
+ _reader_thread: threading.Thread | None = None
57
+
58
+
59
+ def get_intent() -> Intent | None:
60
+ """Return the committed control intent, if any."""
61
+ with _intent_lock:
62
+ return _intent
63
+
64
+
65
+ def _set_intent(value: Intent) -> None:
66
+ global _intent
67
+ with _intent_lock:
68
+ _intent = value
69
+
70
+
71
+ def _clear_intent() -> None:
72
+ global _intent
73
+ with _intent_lock:
74
+ _intent = None
75
+
76
+
77
+ def clear_intent() -> None:
78
+ """Clear the committed control intent after the current session consumes it."""
79
+ _clear_intent()
80
+
81
+
82
+ def configure_from_env() -> None:
83
+ """Consume one-shot control-channel env vars without connecting yet."""
84
+ global _configured, _configured_port, _configured_token
85
+
86
+ with _started_lock:
87
+ if _configured:
88
+ return
89
+
90
+ _configured = True
91
+ port_str = os.environ.pop("PREFECT__CONTROL_PORT", None)
92
+ token = os.environ.pop("PREFECT__CONTROL_TOKEN", None)
93
+ if not port_str or not token:
94
+ return
95
+
96
+ try:
97
+ _configured_port = int(port_str)
98
+ except ValueError:
99
+ _configured_port = None
100
+ _configured_token = None
101
+ return
102
+
103
+ _configured_token = token
104
+
105
+
106
+ def _acknowledge_intent(sock: socket.socket, intent: Intent) -> bool:
107
+ """Commit intent and acknowledge it to the runner."""
108
+ if not commit_control_intent_and_ack(
109
+ commit_intent=lambda: _set_intent(intent),
110
+ clear_intent=_clear_intent,
111
+ send_ack=lambda: sock.sendall(b"a"),
112
+ trigger_cancel=(
113
+ (lambda: _thread.interrupt_main(signal.SIGTERM))
114
+ if os.name == "nt"
115
+ else None
116
+ ),
117
+ ):
118
+ return False
119
+
120
+ return True
121
+
122
+
123
+ def _reader_loop(sock: socket.socket) -> None:
124
+ """Block on the runner's control channel and act on a single intent byte."""
125
+ try:
126
+ while True:
127
+ try:
128
+ data = sock.recv(1)
129
+ except OSError:
130
+ return
131
+ if not data:
132
+ return
133
+
134
+ intent = _INTENT_FOR_BYTE.get(data)
135
+ if intent is None:
136
+ return
137
+
138
+ _acknowledge_intent(sock, intent)
139
+ return
140
+ finally:
141
+ try:
142
+ sock.close()
143
+ except OSError:
144
+ pass
145
+
146
+
147
+ def start() -> None:
148
+ """Connect to the runner's control channel if bootstrap config is present."""
149
+ global _started, _socket, _reader_thread
150
+
151
+ configure_from_env()
152
+
153
+ with _started_lock:
154
+ if _started:
155
+ return
156
+ if _configured_port is None or _configured_token is None:
157
+ return
158
+
159
+ # A new listener session must not inherit a committed intent from an
160
+ # earlier flow run in the same interpreter.
161
+ _clear_intent()
162
+
163
+ try:
164
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
165
+ sock.connect(("127.0.0.1", _configured_port))
166
+ sock.sendall(_configured_token.encode("ascii") + b"\n")
167
+ except OSError:
168
+ try:
169
+ sock.close()
170
+ except (OSError, UnboundLocalError):
171
+ pass
172
+ return
173
+
174
+ thread = threading.Thread(
175
+ target=_reader_loop,
176
+ args=(sock,),
177
+ name="prefect-control-listener",
178
+ daemon=True,
179
+ )
180
+ _socket = sock
181
+ _reader_thread = thread
182
+ _started = True
183
+ thread.start()
184
+
185
+
186
+ def stop() -> None:
187
+ """Close the active control connection, if any."""
188
+ global _configured, _configured_port, _configured_token
189
+ global _started, _socket, _reader_thread
190
+
191
+ with _started_lock:
192
+ sock = _socket
193
+ _socket = None
194
+ _reader_thread = None
195
+ _started = False
196
+ _configured = False
197
+ _configured_port = None
198
+ _configured_token = None
199
+
200
+ if sock is not None:
201
+ try:
202
+ sock.shutdown(socket.SHUT_RDWR)
203
+ except OSError:
204
+ pass
205
+ try:
206
+ sock.close()
207
+ except OSError:
208
+ pass
209
+
210
+
211
+ def reset_for_testing() -> None:
212
+ """Reset module state. Tests only."""
213
+ global _intent, _configured, _configured_port, _configured_token
214
+
215
+ with _intent_lock:
216
+ _intent = None
217
+
218
+ stop()
219
+
220
+ with _started_lock:
221
+ _configured = False
222
+ _configured_port = None
223
+ _configured_token = None
@@ -17,6 +17,15 @@ import anyio
17
17
  import httpx
18
18
  import sniffio
19
19
 
20
+ try:
21
+ _AnyioNoEventLoopError: type[BaseException] = anyio.NoEventLoopError
22
+ except AttributeError:
23
+ # anyio < 4.11.0 doesn't have NoEventLoopError; in older versions,
24
+ # sniffio.AsyncLibraryNotFoundError is raised instead.
25
+ class _AnyioNoEventLoopError(Exception): # type: ignore[no-redef]
26
+ pass
27
+
28
+
20
29
  from prefect.client.schemas.objects import State, StateType
21
30
  from prefect.exceptions import MissingContextError, TerminationSignal
22
31
  from prefect.logging.loggers import get_logger, get_run_logger
@@ -64,7 +73,7 @@ def exception_to_crashed_state_sync(
64
73
  try:
65
74
  cancelled_exc_class = anyio.get_cancelled_exc_class()
66
75
  is_anyio_cancelled = isinstance(exc, cancelled_exc_class)
67
- except (sniffio.AsyncLibraryNotFoundError, anyio.NoEventLoopError):
76
+ except (sniffio.AsyncLibraryNotFoundError, _AnyioNoEventLoopError):
68
77
  is_anyio_cancelled = False
69
78
 
70
79
  if is_anyio_cancelled:
@@ -963,7 +963,7 @@ class RunnerDeployment(BaseModel):
963
963
  concurrency_limit
964
964
  )
965
965
 
966
- deployment = cls(
966
+ kwargs: dict[str, Any] = dict(
967
967
  name=name,
968
968
  flow_name=flow.name,
969
969
  schedules=constructed_schedules,
@@ -977,10 +977,14 @@ class RunnerDeployment(BaseModel):
977
977
  version=version,
978
978
  version_type=version_type,
979
979
  enforce_parameter_schema=enforce_parameter_schema,
980
- work_pool_name=work_pool_name,
981
- work_queue_name=work_queue_name,
982
980
  job_variables=job_variables,
983
981
  )
982
+ if work_pool_name is not None:
983
+ kwargs["work_pool_name"] = work_pool_name
984
+ if work_queue_name is not None:
985
+ kwargs["work_queue_name"] = work_queue_name
986
+
987
+ deployment = cls(**kwargs)
984
988
  deployment._sla = _sla
985
989
 
986
990
  if not deployment.entrypoint:
@@ -1110,7 +1114,7 @@ class RunnerDeployment(BaseModel):
1110
1114
  concurrency_limit
1111
1115
  )
1112
1116
 
1113
- deployment = cls(
1117
+ kwargs: dict[str, Any] = dict(
1114
1118
  name=name,
1115
1119
  flow_name=flow_name or flow.name,
1116
1120
  schedules=constructed_schedules,
@@ -1124,10 +1128,14 @@ class RunnerDeployment(BaseModel):
1124
1128
  version=version,
1125
1129
  entrypoint=entrypoint,
1126
1130
  enforce_parameter_schema=enforce_parameter_schema,
1127
- work_pool_name=work_pool_name,
1128
- work_queue_name=work_queue_name,
1129
1131
  job_variables=job_variables,
1130
1132
  )
1133
+ if work_pool_name is not None:
1134
+ kwargs["work_pool_name"] = work_pool_name
1135
+ if work_queue_name is not None:
1136
+ kwargs["work_queue_name"] = work_queue_name
1137
+
1138
+ deployment = cls(**kwargs)
1131
1139
  deployment._sla = _sla
1132
1140
  deployment._path = str(Path.cwd())
1133
1141
 
@@ -1237,7 +1245,7 @@ class RunnerDeployment(BaseModel):
1237
1245
  if ":" not in entrypoint:
1238
1246
  sys.path.remove(str(storage.destination))
1239
1247
 
1240
- deployment = cls(
1248
+ kwargs: dict[str, Any] = dict(
1241
1249
  name=name,
1242
1250
  flow_name=flow_name or flow.name,
1243
1251
  schedules=constructed_schedules,
@@ -1253,10 +1261,14 @@ class RunnerDeployment(BaseModel):
1253
1261
  entrypoint=entrypoint,
1254
1262
  enforce_parameter_schema=enforce_parameter_schema,
1255
1263
  storage=storage,
1256
- work_pool_name=work_pool_name,
1257
- work_queue_name=work_queue_name,
1258
1264
  job_variables=job_variables,
1259
1265
  )
1266
+ if work_pool_name is not None:
1267
+ kwargs["work_pool_name"] = work_pool_name
1268
+ if work_queue_name is not None:
1269
+ kwargs["work_queue_name"] = work_queue_name
1270
+
1271
+ deployment = cls(**kwargs)
1260
1272
  deployment._sla = _sla
1261
1273
  deployment._entrypoint_type = (
1262
1274
  EntrypointType.FILE_PATH
@@ -1372,7 +1384,7 @@ class RunnerDeployment(BaseModel):
1372
1384
  if ":" not in entrypoint:
1373
1385
  sys.path.remove(str(storage.destination))
1374
1386
 
1375
- deployment = cls(
1387
+ kwargs: dict[str, Any] = dict(
1376
1388
  name=name,
1377
1389
  flow_name=flow_name or flow.name,
1378
1390
  schedules=constructed_schedules,
@@ -1388,10 +1400,14 @@ class RunnerDeployment(BaseModel):
1388
1400
  entrypoint=entrypoint,
1389
1401
  enforce_parameter_schema=enforce_parameter_schema,
1390
1402
  storage=storage,
1391
- work_pool_name=work_pool_name,
1392
- work_queue_name=work_queue_name,
1393
1403
  job_variables=job_variables,
1394
1404
  )
1405
+ if work_pool_name is not None:
1406
+ kwargs["work_pool_name"] = work_pool_name
1407
+ if work_queue_name is not None:
1408
+ kwargs["work_queue_name"] = work_queue_name
1409
+
1410
+ deployment = cls(**kwargs)
1395
1411
  deployment._sla = _sla
1396
1412
  deployment._entrypoint_type = (
1397
1413
  EntrypointType.FILE_PATH
@@ -1,22 +1,26 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import asyncio
4
+ import inspect
3
5
  import os
4
6
  import sys
5
7
  from contextlib import contextmanager
8
+ from types import GeneratorType
6
9
  from typing import TYPE_CHECKING, Any, Callable
7
10
  from uuid import UUID
8
11
 
9
12
  from prefect._internal.compatibility.migration import getattr_migration
13
+ from prefect._internal.control_listener import (
14
+ clear_intent,
15
+ configure_from_env,
16
+ get_intent,
17
+ )
10
18
  from prefect.exceptions import (
11
19
  Abort,
12
20
  Pause,
21
+ TerminationSignal,
13
22
  )
14
- from prefect.logging.loggers import (
15
- get_logger,
16
- )
17
- from prefect.utilities.asyncutils import (
18
- run_coro_as_sync,
19
- )
23
+ from prefect.logging.loggers import get_logger
20
24
 
21
25
  if TYPE_CHECKING:
22
26
  import logging
@@ -28,6 +32,32 @@ if TYPE_CHECKING:
28
32
  engine_logger: "logging.Logger" = get_logger("engine")
29
33
 
30
34
 
35
+ def _drive_run_flow_result(flow: Any, run_result: object) -> None:
36
+ """Execute deferred work for generator flows returned by `run_flow()`."""
37
+ if getattr(flow, "isasync", False) and getattr(flow, "isgenerator", False):
38
+ if not inspect.isasyncgen(run_result):
39
+ return
40
+
41
+ async def _consume_asyncgen() -> None:
42
+ async for _ in run_result:
43
+ pass
44
+
45
+ asyncio.run(_consume_asyncgen())
46
+ return
47
+
48
+ if not getattr(flow, "isasync", False) and getattr(flow, "isgenerator", False):
49
+ if not isinstance(run_result, GeneratorType):
50
+ return
51
+ for _ in run_result:
52
+ pass
53
+ return
54
+
55
+ if getattr(flow, "isasync", False) and not getattr(flow, "isgenerator", False):
56
+ if not asyncio.iscoroutine(run_result):
57
+ return
58
+ asyncio.run(run_result)
59
+
60
+
31
61
  @contextmanager
32
62
  def handle_engine_signals(flow_run_id: UUID | None = None):
33
63
  """
@@ -69,6 +99,21 @@ def handle_engine_signals(flow_run_id: UUID | None = None):
69
99
  msg = "Execution is paused."
70
100
  engine_logger.info(msg)
71
101
  exit(0)
102
+ except TerminationSignal:
103
+ # A TerminationSignal can mean either:
104
+ # - an expected runner-driven control action (today: cancel intent),
105
+ # - or a raw external termination with no runner intent attached.
106
+ #
107
+ # Only the first case should translate to a clean process exit.
108
+ if get_intent() == "cancel":
109
+ if flow_run_id:
110
+ msg = f"Execution of flow run '{flow_run_id}' was cancelled."
111
+ else:
112
+ msg = "Execution was cancelled."
113
+ engine_logger.info(msg)
114
+ clear_intent()
115
+ exit(0)
116
+ raise
72
117
  except Exception:
73
118
  if flow_run_id:
74
119
  msg = f"Execution of flow run '{flow_run_id}' exited with unexpected exception"
@@ -97,6 +142,13 @@ if __name__ == "__main__":
97
142
  )
98
143
  exit(1)
99
144
 
145
+ # Consume the runner control-channel bootstrap env before loading any
146
+ # flow code, but do not connect yet. The actual socket connection is
147
+ # established only while `capture_sigterm()` is active inside the flow
148
+ # engine; cancels that land before then fall back to the existing
149
+ # crash-style termination path.
150
+ configure_from_env()
151
+
100
152
  with handle_engine_signals(flow_run_id):
101
153
  from prefect.flow_engine import (
102
154
  flow_run_logger,
@@ -118,14 +170,15 @@ if __name__ == "__main__":
118
170
  )
119
171
  raise
120
172
 
121
- # run the flow
173
+ # Run async flows on a main-thread event loop in this subprocess so
174
+ # `capture_sigterm()` can install Prefect's SIGTERM bridge. Using the
175
+ # shared run-sync loop here moves execution off the main thread, which
176
+ # prevents graceful cancellation from ever becoming ready.
122
177
  with RunMetrics(flow_run, flow):
123
- if flow.isasync:
124
- run_coro_as_sync(
125
- run_flow(flow, flow_run=flow_run, error_logger=run_logger)
126
- )
127
- else:
128
- run_flow(flow, flow_run=flow_run, error_logger=run_logger)
178
+ _run_result: object = run_flow(
179
+ flow, flow_run=flow_run, error_logger=run_logger
180
+ )
181
+ _drive_run_flow_result(flow, _run_result)
129
182
 
130
183
 
131
184
  __getattr__: Callable[[str], Any] = getattr_migration(__name__)