prefect-client 3.6.30.dev2__tar.gz → 3.6.30.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 (426) hide show
  1. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/.gitignore +2 -0
  2. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/PKG-INFO +1 -1
  3. prefect_client-3.6.30.dev4/hatch_build.py +61 -0
  4. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/AGENTS.md +4 -0
  5. prefect_client-3.6.30.dev4/src/prefect/_build_info.py +5 -0
  6. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/__init__.py +42 -0
  7. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/routes.py +1 -0
  8. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/objects.py +18 -0
  9. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/AGENTS.md +2 -0
  10. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/core.py +43 -0
  11. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/flow_engine.py +131 -18
  12. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/flows.py +147 -19
  13. prefect_client-3.6.30.dev4/src/prefect/locking/_filelock.py +242 -0
  14. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/results.py +151 -20
  15. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/AGENTS.md +18 -1
  16. prefect_client-3.6.30.dev4/src/prefect/runner/_workspace_resolver.py +360 -0
  17. prefect_client-3.6.30.dev4/src/prefect/runner/_workspace_starter.py +289 -0
  18. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/storage.py +17 -0
  19. prefect_client-3.6.30.dev4/src/prefect/server/api/admin.py +85 -0
  20. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/concurrency_limits_v2.py +37 -17
  21. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/server.py +252 -60
  22. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/ui.py +1 -1
  23. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/task_engine.py +8 -6
  24. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/task_runners.py +80 -1
  25. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/AGENTS.md +1 -1
  26. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/templating/__init__.py +64 -39
  27. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/visualization.py +18 -0
  28. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/base.py +25 -11
  29. prefect_client-3.6.30.dev2/src/prefect/_build_info.py +0 -5
  30. prefect_client-3.6.30.dev2/src/prefect/server/api/admin.py +0 -25
  31. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/LICENSE +0 -0
  32. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/README.md +0 -0
  33. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/pyproject.toml +0 -0
  34. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/.prefectignore +0 -0
  35. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/__init__.py +0 -0
  36. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/__main__.py +0 -0
  37. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/__init__.py +0 -0
  38. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/_launchers.py +0 -0
  39. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/__init__.py +0 -0
  40. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
  41. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
  42. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
  43. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
  44. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
  45. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/execute.py +0 -0
  46. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/__init__.py +0 -0
  47. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/apply.py +0 -0
  48. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  49. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/manager.py +0 -0
  50. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/spec.py +0 -0
  51. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/__init__.py +0 -0
  52. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/client.py +0 -0
  53. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/objects.py +0 -0
  54. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/__init__.py +0 -0
  55. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/_logging.py +0 -0
  56. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/__init__.py +0 -0
  57. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  58. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/client.py +0 -0
  59. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/device_id.py +0 -0
  60. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/emit.py +0 -0
  61. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/enabled.py +0 -0
  62. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/events.py +0 -0
  63. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/milestones.py +0 -0
  64. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/notice.py +0 -0
  65. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/service.py +0 -0
  66. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/__init__.py +0 -0
  67. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  68. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/backports.py +0 -0
  69. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/blocks.py +0 -0
  70. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  71. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/migration.py +0 -0
  72. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/starlette.py +0 -0
  73. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/__init__.py +0 -0
  74. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/api.py +0 -0
  75. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/calls.py +0 -0
  76. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  77. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  78. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/inspection.py +0 -0
  79. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/primitives.py +0 -0
  80. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/services.py +0 -0
  81. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/threads.py +0 -0
  82. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/waiters.py +0 -0
  83. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/control_listener.py +0 -0
  84. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/installation.py +0 -0
  85. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/integrations.py +0 -0
  86. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/lazy.py +0 -0
  87. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/observability.py +0 -0
  88. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/__init__.py +0 -0
  89. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/schemas.py +0 -0
  90. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  91. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  92. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  93. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pytz.py +0 -0
  94. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/retries.py +0 -0
  95. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/__init__.py +0 -0
  96. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/bases.py +0 -0
  97. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/fields.py +0 -0
  98. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/serializers.py +0 -0
  99. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/validators.py +0 -0
  100. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  101. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/testing.py +0 -0
  102. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/urls.py +0 -0
  103. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/uuid7.py +0 -0
  104. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/websockets.py +0 -0
  105. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_observers.py +0 -0
  106. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_result_records.py +0 -0
  107. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/__init__.py +0 -0
  108. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/fetcher.py +0 -0
  109. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/generator.py +0 -0
  110. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/models.py +0 -0
  111. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/naming.py +0 -0
  112. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/renderer.py +0 -0
  113. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/schema_converter.py +0 -0
  114. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/templates/__init__.py +0 -0
  115. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  116. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/types.py +0 -0
  117. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/unions.py +0 -0
  118. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_states.py +0 -0
  119. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_vendor/croniter/__init__.py +0 -0
  120. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_vendor/croniter/croniter.py +0 -0
  121. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_versioning.py +0 -0
  122. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_waiters.py +0 -0
  123. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/agent.py +0 -0
  124. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/analytics/__init__.py +0 -0
  125. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/artifacts.py +0 -0
  126. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/assets/__init__.py +0 -0
  127. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/assets/core.py +0 -0
  128. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/assets/materialize.py +0 -0
  129. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/automations.py +0 -0
  130. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/AGENTS.md +0 -0
  131. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/__init__.py +0 -0
  132. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/abstract.py +0 -0
  133. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/core.py +0 -0
  134. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/fields.py +0 -0
  135. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/notifications.py +0 -0
  136. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/redis.py +0 -0
  137. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/system.py +0 -0
  138. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/webhook.py +0 -0
  139. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/cache_policies.py +0 -0
  140. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/AGENTS.md +0 -0
  141. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/__init__.py +0 -0
  142. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/_version_checking.py +0 -0
  143. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/attribution.py +0 -0
  144. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/base.py +0 -0
  145. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/cloud.py +0 -0
  146. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/collections.py +0 -0
  147. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/constants.py +0 -0
  148. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  149. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  150. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  151. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_automations/client.py +0 -0
  152. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  153. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  154. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  155. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  156. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  157. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  158. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  159. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  160. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  161. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  162. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  163. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_events/client.py +0 -0
  164. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  165. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  166. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  167. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flows/client.py +0 -0
  168. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  169. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_logs/client.py +0 -0
  170. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  171. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_variables/client.py +0 -0
  172. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  173. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  174. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/base.py +0 -0
  175. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/__init__.py +0 -0
  176. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/actions.py +0 -0
  177. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/events.py +0 -0
  178. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/filters.py +0 -0
  179. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/responses.py +0 -0
  180. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/schedules.py +0 -0
  181. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/sorting.py +0 -0
  182. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/subscriptions.py +0 -0
  183. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/types/__init__.py +0 -0
  184. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  185. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/utilities.py +0 -0
  186. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/AGENTS.md +0 -0
  187. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/__init__.py +0 -0
  188. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_asyncio.py +0 -0
  189. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_events.py +0 -0
  190. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_leases.py +0 -0
  191. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_sync.py +0 -0
  192. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/asyncio.py +0 -0
  193. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/context.py +0 -0
  194. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/services.py +0 -0
  195. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/sync.py +0 -0
  196. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/__init__.py +0 -0
  197. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  198. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/_events.py +0 -0
  199. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/asyncio.py +0 -0
  200. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/context.py +0 -0
  201. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/services.py +0 -0
  202. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/sync.py +0 -0
  203. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/context.py +0 -0
  204. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/__init__.py +0 -0
  205. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/base.py +0 -0
  206. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/deployments.py +0 -0
  207. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/flow_runs.py +0 -0
  208. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/runner.py +0 -0
  209. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/schedules.py +0 -0
  210. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/__init__.py +0 -0
  211. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/pull.py +0 -0
  212. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/utility.py +0 -0
  213. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/docker/__init__.py +0 -0
  214. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/docker/_buildx.py +0 -0
  215. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/docker/docker_image.py +0 -0
  216. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/engine.py +0 -0
  217. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/AGENTS.md +0 -0
  218. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/__init__.py +0 -0
  219. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/actions.py +0 -0
  220. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/clients.py +0 -0
  221. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/filters.py +0 -0
  222. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/related.py +0 -0
  223. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/__init__.py +0 -0
  224. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/automations.py +0 -0
  225. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  226. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/events.py +0 -0
  227. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/labelling.py +0 -0
  228. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/subscribers.py +0 -0
  229. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/utilities.py +0 -0
  230. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/worker.py +0 -0
  231. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/exceptions.py +0 -0
  232. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/filesystems.py +0 -0
  233. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/flow_runs.py +0 -0
  234. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/futures.py +0 -0
  235. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/__init__.py +0 -0
  236. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/base.py +0 -0
  237. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  238. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  239. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  240. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  241. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  242. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  243. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/input/__init__.py +0 -0
  244. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/input/actions.py +0 -0
  245. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/input/run_input.py +0 -0
  246. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/locking/__init__.py +0 -0
  247. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/locking/filesystem.py +0 -0
  248. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/locking/memory.py +0 -0
  249. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/locking/protocol.py +0 -0
  250. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/AGENTS.md +0 -0
  251. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/__init__.py +0 -0
  252. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/clients.py +0 -0
  253. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/configuration.py +0 -0
  254. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/filters.py +0 -0
  255. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/formatters.py +0 -0
  256. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/handlers.py +0 -0
  257. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/highlighters.py +0 -0
  258. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/loggers.py +0 -0
  259. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/logging.yml +0 -0
  260. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/main.py +0 -0
  261. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/plugins.py +0 -0
  262. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/py.typed +0 -0
  263. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/__init__.py +0 -0
  264. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_cancel_finalizer.py +0 -0
  265. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_cancellation_manager.py +0 -0
  266. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_control_channel.py +0 -0
  267. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_deployment_registry.py +0 -0
  268. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_event_emitter.py +0 -0
  269. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_flow_resolver.py +0 -0
  270. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_flow_run_executor.py +0 -0
  271. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_hook_runner.py +0 -0
  272. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_limit_manager.py +0 -0
  273. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_process_manager.py +0 -0
  274. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  275. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_bundle.py +0 -0
  276. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_direct.py +0 -0
  277. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_engine.py +0 -0
  278. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_state_proposer.py +0 -0
  279. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/runner.py +0 -0
  280. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/server.py +0 -0
  281. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runtime/__init__.py +0 -0
  282. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runtime/deployment.py +0 -0
  283. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runtime/flow_run.py +0 -0
  284. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runtime/task_run.py +0 -0
  285. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/schedules.py +0 -0
  286. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/serializers.py +0 -0
  287. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/__init__.py +0 -0
  288. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/artifacts.py +0 -0
  289. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/automations.py +0 -0
  290. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/background_workers.py +0 -0
  291. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_capabilities.py +0 -0
  292. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_documents.py +0 -0
  293. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_schemas.py +0 -0
  294. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_types.py +0 -0
  295. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/clients.py +0 -0
  296. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/collections.py +0 -0
  297. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  298. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/concurrency_limits.py +0 -0
  299. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/csrf_token.py +0 -0
  300. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/dependencies.py +0 -0
  301. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/deployments.py +0 -0
  302. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/events.py +0 -0
  303. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flow_run_states.py +0 -0
  304. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flow_runs.py +0 -0
  305. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flows.py +0 -0
  306. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/logs.py +0 -0
  307. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/middleware.py +0 -0
  308. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/root.py +0 -0
  309. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/run_history.py +0 -0
  310. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/saved_searches.py +0 -0
  311. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  312. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_run_states.py +0 -0
  313. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_runs.py +0 -0
  314. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_workers.py +0 -0
  315. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/templates.py +0 -0
  316. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/__init__.py +0 -0
  317. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/flow_runs.py +0 -0
  318. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/flows.py +0 -0
  319. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/schemas.py +0 -0
  320. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/task_runs.py +0 -0
  321. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/validation.py +0 -0
  322. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/variables.py +0 -0
  323. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/work_queues.py +0 -0
  324. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/workers.py +0 -0
  325. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/AGENTS.md +0 -0
  326. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/__init__.py +0 -0
  327. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/base.py +0 -0
  328. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/constants.py +0 -0
  329. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/context.py +0 -0
  330. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/legacy.py +0 -0
  331. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/__init__.py +0 -0
  332. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/_defaults.py +0 -0
  333. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/api.py +0 -0
  334. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/cli.py +0 -0
  335. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/client.py +0 -0
  336. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/cloud.py +0 -0
  337. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/deployments.py +0 -0
  338. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/events.py +0 -0
  339. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/experiments.py +0 -0
  340. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/flows.py +0 -0
  341. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/internal.py +0 -0
  342. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/logging.py +0 -0
  343. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/results.py +0 -0
  344. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/root.py +0 -0
  345. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/runner.py +0 -0
  346. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/__init__.py +0 -0
  347. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/api.py +0 -0
  348. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/concurrency.py +0 -0
  349. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/database.py +0 -0
  350. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/deployments.py +0 -0
  351. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/docket.py +0 -0
  352. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/ephemeral.py +0 -0
  353. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/events.py +0 -0
  354. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  355. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/logs.py +0 -0
  356. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/root.py +0 -0
  357. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/services.py +0 -0
  358. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/tasks.py +0 -0
  359. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/tasks.py +0 -0
  360. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/telemetry.py +0 -0
  361. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/testing.py +0 -0
  362. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/worker.py +0 -0
  363. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/profiles.py +0 -0
  364. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/profiles.toml +0 -0
  365. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/sources.py +0 -0
  366. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/states.py +0 -0
  367. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/task_runs.py +0 -0
  368. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/task_worker.py +0 -0
  369. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/tasks.py +0 -0
  370. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/__init__.py +0 -0
  371. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/_metrics.py +0 -0
  372. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/run_telemetry.py +0 -0
  373. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/transactions.py +0 -0
  374. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/__init__.py +0 -0
  375. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/_concurrency.py +0 -0
  376. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/_datetime.py +0 -0
  377. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/_schema.py +0 -0
  378. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/entrypoint.py +0 -0
  379. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/names.py +0 -0
  380. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/__init__.py +0 -0
  381. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_ast.py +0 -0
  382. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_deprecated.py +0 -0
  383. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_engine.py +0 -0
  384. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_git.py +0 -0
  385. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
  386. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/annotations.py +0 -0
  387. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  388. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  389. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/callables/AGENTS.md +0 -0
  390. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/callables/__init__.py +0 -0
  391. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/collections.py +0 -0
  392. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/compat.py +0 -0
  393. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/context.py +0 -0
  394. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/dispatch.py +0 -0
  395. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/dockerutils.py +0 -0
  396. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/engine/AGENTS.md +0 -0
  397. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/engine/__init__.py +0 -0
  398. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  399. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/filesystem/__init__.py +0 -0
  400. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/generics.py +0 -0
  401. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/hashing.py +0 -0
  402. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/importtools.py +0 -0
  403. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/math.py +0 -0
  404. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/names.py +0 -0
  405. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  406. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/processutils/__init__.py +0 -0
  407. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/pydantic.py +0 -0
  408. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/render_swagger.py +0 -0
  409. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  410. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  411. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  412. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/validation.py +0 -0
  413. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/services.py +0 -0
  414. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/slugify.py +0 -0
  415. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/templating/AGENTS.md +0 -0
  416. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/text.py +0 -0
  417. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/timeout.py +0 -0
  418. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/urls.py +0 -0
  419. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/variables.py +0 -0
  420. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/AGENTS.md +0 -0
  421. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/__init__.py +0 -0
  422. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/block.py +0 -0
  423. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/cloud.py +0 -0
  424. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/process.py +0 -0
  425. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/server.py +0 -0
  426. {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/utilities.py +0 -0
@@ -54,6 +54,8 @@ src/mkdocs-material
54
54
  # UI artifacts
55
55
  src/prefect/server/ui/*
56
56
  src/prefect/server/ui_build/*
57
+ src/prefect/server/ui-v2/*
58
+ src/prefect/server/ui_v2_build/*
57
59
  **/node_modules
58
60
 
59
61
  # Databases
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect-client
3
- Version: 3.6.30.dev2
3
+ Version: 3.6.30.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
@@ -0,0 +1,61 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from pathlib import Path
5
+ from typing import Any
6
+
7
+ try:
8
+ from hatchling.builders.hooks.plugin.interface import BuildHookInterface
9
+ except ModuleNotFoundError: # pragma: no cover - only used when testing helpers
10
+
11
+ class BuildHookInterface: # type: ignore[no-redef]
12
+ root: str
13
+ target_name: str
14
+
15
+
16
+ PACKAGED_UI_INDEX_FILES = (
17
+ Path("src/prefect/server/ui/index.html"),
18
+ Path("src/prefect/server/ui-v2/index.html"),
19
+ )
20
+ REQUIRE_PACKAGED_UI_ENV_VAR = "PREFECT_REQUIRE_PACKAGED_UI_BUNDLES"
21
+
22
+
23
+ def _truthy_env_var(name: str) -> bool:
24
+ return os.environ.get(name, "").lower() not in {"", "0", "false", "no", "off"}
25
+
26
+
27
+ def should_validate_packaged_ui_index_files(root: str | Path) -> bool:
28
+ if _truthy_env_var(REQUIRE_PACKAGED_UI_ENV_VAR):
29
+ return True
30
+
31
+ root_path = Path(root)
32
+ return any(
33
+ (root_path / index_file.parent).exists()
34
+ for index_file in PACKAGED_UI_INDEX_FILES
35
+ )
36
+
37
+
38
+ def validate_packaged_ui_index_files(root: str | Path) -> None:
39
+ root_path = Path(root)
40
+ missing_index_files = [
41
+ str(index_file)
42
+ for index_file in PACKAGED_UI_INDEX_FILES
43
+ if not (root_path / index_file).is_file()
44
+ ]
45
+
46
+ if missing_index_files:
47
+ raise RuntimeError(
48
+ "Prefect package builds require both UI bundles to be built. "
49
+ "Missing index.html files: "
50
+ f"{', '.join(missing_index_files)}"
51
+ )
52
+
53
+
54
+ class CustomBuildHook(BuildHookInterface):
55
+ def initialize(self, version: str, build_data: dict[str, Any]) -> None:
56
+ if (
57
+ version != "editable"
58
+ and self.target_name in {"sdist", "wheel"}
59
+ and should_validate_packaged_ui_index_files(self.root)
60
+ ):
61
+ validate_packaged_ui_index_files(self.root)
@@ -10,6 +10,7 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
10
10
 
11
11
  - `flows.py` / `tasks.py` — `@flow` and `@task` decorator definitions. The primary user-facing API.
12
12
  - `flow_engine.py` / `task_engine.py` — Async execution engines that orchestrate runs. **Critical invariant:** both sync and async engine paths must be kept in lockstep. Changes to one must be mirrored in the other.
13
+ - `flow_engine.py` is also a subprocess entrypoint: `python -m prefect.flow_engine <entrypoint>`. Reads `PREFECT__FLOW_RUN_ID` from the environment; accepts exactly one argument (the flow entrypoint path or module ref). Workers and infrastructure use this to launch flow runs as isolated subprocesses. Plain functions not decorated with `@flow` are auto-converted to flows at this entry point.
13
14
  - `states.py` — State objects and transition logic
14
15
  - `results.py` — Result persistence and retrieval
15
16
  - `futures.py` — `PrefectFuture` for async task results
@@ -20,12 +21,15 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
20
21
  ## Key Contracts
21
22
 
22
23
  - **Engine ordering matters.** The engines apply features (retries, caching, result persistence, transactions) in a specific order. Changing the order or forgetting a feature in one engine path is the most common source of breakage.
24
+ - **Set run metadata before state transitions.** Any run attribute that event subscribers observe at the moment of a state transition (e.g., custom `flow_run_name`) must be persisted to the server *before* `set_state()` is called for that transition. Metadata set after the call appears stale to subscribers of that state event.
23
25
  - **Sync and async must stay in sync.** Both `flow_engine.py` and `task_engine.py` have sync and async paths. Any behavior change must be applied to both.
24
26
  - **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences between whenever 0.7.x–0.9.x and ≥ 0.10.0. The `_WHENEVER_NEW_API` flag (True when whenever ≥ 0.10.0) guards version-specific code. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Violations will silently break on whichever whenever version the helpers weren't written for.
25
27
  - **Flow and task engines advance state differently.** The flow engine makes blocking API calls to the server to propose and advance states. The task engine emits `prefect.task_run.*` events (delivered via WebSockets) but advances state locally through `set_state` calls with polling/backoff — do not assume the two engines work the same way.
26
28
  - **Flow state transitions go through the server.** The flow engine proposes states to the server, which accepts or rejects them via orchestration rules. The task engine, by contrast, manages state transitions locally via `set_state` and emits `prefect.task_run.*` events — it does not propose states to the server.
27
29
  - **`ProcessPoolTaskRunner` requires picklable data across subprocess boundaries.** `PrefectFuture` objects are not picklable and cannot be passed to worker subprocesses. Any `wait_for` futures must be waited on in the parent process and converted to `State` objects before submission. The subprocess task engine handles `State` objects via `resolve_to_final_result`, which raises `UpstreamTaskError` for non-completed upstreams.
28
30
  - **`ProcessPoolTaskRunner` instances may be deserialized without `__init__` running.** When a runner is pickled and restored in a subprocess, `__init__` is not called, so instance attributes set there may be absent. Access any such attribute via `getattr(self, "_attr", default)` rather than `self._attr` directly — both in the property getter and in `duplicate()`. The `subprocess_message_processor_factories` property demonstrates the required pattern.
31
+ - **`ThreadPoolTaskRunner` is cloudpickled when a flow run is dispatched to a subprocess.** `threading.Lock` and other non-picklable thread primitives must be dropped in `__getstate__` and rebuilt in `__setstate__`. Any new instance state added to this class must be evaluated for picklability.
32
+ - **Nested task submissions on a bounded `ThreadPoolTaskRunner` can deadlock.** When a worker task submits children and blocks on `.result()` while all `max_workers` threads are busy, the pool starves. `_warn_if_nested_submit_would_deadlock` detects this and emits a one-time warning — preserve this detection when changing pool management.
29
33
  - **`ResultRecordMetadata` tolerates unknown serializer types.** When loading persisted metadata, an unrecognized serializer `type` is converted to an `UnknownSerializer` placeholder rather than raising `ValidationError`. This allows inspecting result metadata when the serializer implementation is unavailable in the current environment. However, known serializer types with invalid fields still raise `ValidationError`. `UnknownSerializer.dumps()` and `UnknownSerializer.loads()` raise `RuntimeError` — the tolerance is for inspection only, not actual serialization/deserialization.
30
34
 
31
35
  ## Logging
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.6.30.dev4"
3
+ __build_date__ = "2026-05-06 08:56:13.081322+00:00"
4
+ __git_commit__ = "2b9d462118706889dfeee26df45a1b6108491070"
5
+ __dirty__ = False
@@ -110,6 +110,8 @@ from prefect.client.schemas.objects import (
110
110
  FlowRunResult,
111
111
  Parameter,
112
112
  Constant,
113
+ ServerDefaultResultStorage,
114
+ ServerDefaultResultStorageUpdate,
113
115
  TaskRunPolicy,
114
116
  WorkQueue,
115
117
  WorkQueueStatusDetail,
@@ -1079,6 +1081,27 @@ class PrefectClient(
1079
1081
  res = await self._client.get("/admin/version")
1080
1082
  return res.json()
1081
1083
 
1084
+ async def read_server_default_result_storage(
1085
+ self,
1086
+ ) -> ServerDefaultResultStorage:
1087
+ response = await self._client.get("/admin/storage")
1088
+ return ServerDefaultResultStorage.model_validate(response.json())
1089
+
1090
+ async def update_server_default_result_storage(
1091
+ self,
1092
+ default_result_storage_block_id: UUID,
1093
+ ) -> ServerDefaultResultStorage:
1094
+ response = await self._client.put(
1095
+ "/admin/storage",
1096
+ json=ServerDefaultResultStorageUpdate(
1097
+ default_result_storage_block_id=default_result_storage_block_id
1098
+ ).model_dump(mode="json"),
1099
+ )
1100
+ return ServerDefaultResultStorage.model_validate(response.json())
1101
+
1102
+ async def clear_server_default_result_storage(self) -> None:
1103
+ await self._client.delete("/admin/storage")
1104
+
1082
1105
  def client_version(self) -> str:
1083
1106
  return prefect.__version__
1084
1107
 
@@ -1451,6 +1474,25 @@ class SyncPrefectClient(
1451
1474
  res = self._client.get("/admin/version")
1452
1475
  return res.json()
1453
1476
 
1477
+ def read_server_default_result_storage(self) -> ServerDefaultResultStorage:
1478
+ response = self._client.get("/admin/storage")
1479
+ return ServerDefaultResultStorage.model_validate(response.json())
1480
+
1481
+ def update_server_default_result_storage(
1482
+ self,
1483
+ default_result_storage_block_id: UUID,
1484
+ ) -> ServerDefaultResultStorage:
1485
+ response = self._client.put(
1486
+ "/admin/storage",
1487
+ json=ServerDefaultResultStorageUpdate(
1488
+ default_result_storage_block_id=default_result_storage_block_id
1489
+ ).model_dump(mode="json"),
1490
+ )
1491
+ return ServerDefaultResultStorage.model_validate(response.json())
1492
+
1493
+ def clear_server_default_result_storage(self) -> None:
1494
+ self._client.delete("/admin/storage")
1495
+
1454
1496
  def client_version(self) -> str:
1455
1497
  return prefect.__version__
1456
1498
 
@@ -1,6 +1,7 @@
1
1
  from typing import Literal
2
2
 
3
3
  ServerRoutes = Literal[
4
+ "/admin/storage",
4
5
  "/admin/settings",
5
6
  "/admin/version",
6
7
  "/artifacts/",
@@ -1550,6 +1550,24 @@ class WorkPoolStorageConfiguration(PrefectBaseModel):
1550
1550
  )
1551
1551
 
1552
1552
 
1553
+ class ServerDefaultResultStorage(PrefectBaseModel):
1554
+ """Server-side default result storage configuration."""
1555
+
1556
+ default_result_storage_block_id: Optional[UUID] = Field(
1557
+ default=None,
1558
+ description="The block document ID of the server default result storage block.",
1559
+ )
1560
+
1561
+
1562
+ class ServerDefaultResultStorageUpdate(PrefectBaseModel):
1563
+ """Request payload for setting the server default result storage block."""
1564
+
1565
+ default_result_storage_block_id: UUID = Field(
1566
+ default=...,
1567
+ description="The block document ID of the server default result storage block.",
1568
+ )
1569
+
1570
+
1553
1571
  class WorkPool(ObjectBaseModel):
1554
1572
  """An ORM representation of a work pool"""
1555
1573
 
@@ -23,6 +23,8 @@ Built-in steps:
23
23
  - `steps/pull.py` — `git_clone`, `set_working_directory`, `pull_from_remote_storage`
24
24
  - `steps/utility.py` — `run_shell_script`, `pip_install_requirements`
25
25
 
26
+ **Step observer**: `run_steps` does not accept a step completion callback as a parameter by design — inject one via `_observe_step_completion(callback)` context manager from `steps/core.py`. The callback receives `(step, output, cwd_before, cwd_after)` after each step; either CWD arg is `None` when the directory becomes inaccessible (e.g., the step deleted its working directory).
27
+
26
28
  ## Entrypoint Formats
27
29
 
28
30
  `runner.py`'s `from_storage` / `afrom_storage` (and `Flow.from_source`) support two entrypoint formats:
@@ -17,8 +17,12 @@ import os
17
17
  import re
18
18
  import subprocess
19
19
  import warnings
20
+ from collections.abc import Callable, Iterator
21
+ from contextlib import contextmanager
22
+ from contextvars import ContextVar
20
23
  from copy import deepcopy
21
24
  from importlib import import_module
25
+ from pathlib import Path
22
26
  from typing import Any
23
27
  from uuid import UUID
24
28
 
@@ -39,6 +43,15 @@ from prefect.utilities.templating import (
39
43
 
40
44
  RESERVED_KEYWORDS = {"id", "requires"}
41
45
 
46
+ _StepCompletionObserver = Callable[
47
+ [dict[str, Any], Any, Path | None, Path | None],
48
+ None,
49
+ ]
50
+ _STEP_COMPLETION_OBSERVER: ContextVar[_StepCompletionObserver | None] = ContextVar(
51
+ "step_completion_observer",
52
+ default=None,
53
+ )
54
+
42
55
 
43
56
  class StepExecutionError(Exception):
44
57
  """
@@ -46,6 +59,22 @@ class StepExecutionError(Exception):
46
59
  """
47
60
 
48
61
 
62
+ def _safe_current_working_directory() -> Path | None:
63
+ try:
64
+ return Path.cwd().resolve()
65
+ except OSError:
66
+ return None
67
+
68
+
69
+ @contextmanager
70
+ def _observe_step_completion(callback: _StepCompletionObserver) -> Iterator[None]:
71
+ token = _STEP_COMPLETION_OBSERVER.set(callback)
72
+ try:
73
+ yield
74
+ finally:
75
+ _STEP_COMPLETION_OBSERVER.reset(token)
76
+
77
+
49
78
  def _strip_version(requirement: str) -> str:
50
79
  """
51
80
  Strips the version from a requirement string.
@@ -152,6 +181,7 @@ async def run_steps(
152
181
  logger: Any | None = None,
153
182
  ) -> dict[str, Any]:
154
183
  upstream_outputs = deepcopy(upstream_outputs) if upstream_outputs else {}
184
+ step_completion_observer = _STEP_COMPLETION_OBSERVER.get()
155
185
  for step_index, step in enumerate(steps):
156
186
  if not step:
157
187
  continue
@@ -177,6 +207,11 @@ async def run_steps(
177
207
 
178
208
  try:
179
209
  # catch warnings to ensure deprecation warnings are printed
210
+ step_start_cwd = (
211
+ _safe_current_working_directory()
212
+ if step_completion_observer is not None
213
+ else None
214
+ )
180
215
  with warnings.catch_warnings(record=True) as w:
181
216
  warnings.simplefilter(
182
217
  "always",
@@ -201,6 +236,14 @@ async def run_steps(
201
236
  print_function(message)
202
237
  printed_messages.append(message)
203
238
 
239
+ if step_completion_observer is not None:
240
+ step_completion_observer(
241
+ step,
242
+ step_output,
243
+ step_start_cwd,
244
+ _safe_current_working_directory(),
245
+ )
246
+
204
247
  if not isinstance(step_output, dict):
205
248
  if PREFECT_DEBUG_MODE:
206
249
  get_logger().warning(
@@ -8,6 +8,7 @@ import multiprocessing
8
8
  import multiprocessing.context
9
9
  import os
10
10
  import signal
11
+ import sys
11
12
  import threading
12
13
  import time
13
14
  from contextlib import (
@@ -66,7 +67,7 @@ from prefect.context import (
66
67
  hydrated_context,
67
68
  serialize_context,
68
69
  )
69
- from prefect.engine import handle_engine_signals
70
+ from prefect.engine import _drive_run_flow_result, handle_engine_signals
70
71
  from prefect.events.related import RelatedResource, tags_as_related_resources
71
72
  from prefect.events.utilities import emit_event
72
73
  from prefect.exceptions import (
@@ -92,6 +93,8 @@ from prefect.logging.loggers import (
92
93
  )
93
94
  from prefect.results import (
94
95
  ResultStore,
96
+ _aget_default_persist_result,
97
+ _get_default_persist_result,
95
98
  get_result_store,
96
99
  should_persist_result,
97
100
  )
@@ -109,6 +112,7 @@ from prefect.states import (
109
112
  exception_to_failed_state,
110
113
  return_value_to_state,
111
114
  )
115
+ from prefect.telemetry._metrics import RunMetrics
112
116
  from prefect.telemetry.run_telemetry import (
113
117
  LABELS_TRACEPARENT_KEY,
114
118
  TRACEPARENT_KEY,
@@ -142,6 +146,7 @@ P = ParamSpec("P")
142
146
  R = TypeVar("R")
143
147
 
144
148
  MINIMUM_HEARTBEAT_INTERVAL = 30
149
+ _engine_logger = get_logger("engine")
145
150
  _CONTROL_CHANNEL_ENV_KEYS = frozenset(
146
151
  {"PREFECT__CONTROL_PORT", "PREFECT__CONTROL_TOKEN"}
147
152
  )
@@ -220,15 +225,18 @@ def load_flow_run(flow_run_id: UUID) -> FlowRun:
220
225
  return flow_run
221
226
 
222
227
 
228
+ def _load_flow_from_runtime_entrypoint(entrypoint: str) -> Flow[..., Any]:
229
+ try:
230
+ return load_flow_from_entrypoint(entrypoint, use_placeholder_flow=False)
231
+ except MissingFlowError:
232
+ return load_function_and_convert_to_flow(entrypoint)
233
+
234
+
223
235
  def load_flow(flow_run: FlowRun) -> Flow[..., Any]:
224
236
  entrypoint = os.environ.get("PREFECT__FLOW_ENTRYPOINT")
225
237
 
226
238
  if entrypoint:
227
- # we should not accept a placeholder flow at runtime
228
- try:
229
- flow = load_flow_from_entrypoint(entrypoint, use_placeholder_flow=False)
230
- except MissingFlowError:
231
- flow = load_function_and_convert_to_flow(entrypoint)
239
+ flow = _load_flow_from_runtime_entrypoint(entrypoint)
232
240
  else:
233
241
  flow = run_coro_as_sync(
234
242
  load_flow_from_flow_run(flow_run, use_placeholder_flow=False)
@@ -242,6 +250,51 @@ def load_flow_and_flow_run(flow_run_id: UUID) -> tuple[FlowRun, Flow[..., Any]]:
242
250
  return flow_run, flow
243
251
 
244
252
 
253
+ def _run_flow_from_runtime_entrypoint(flow_run_id: UUID, entrypoint: str) -> None:
254
+ configure_from_env()
255
+
256
+ with handle_engine_signals(flow_run_id):
257
+ flow_run = load_flow_run(flow_run_id=flow_run_id)
258
+ run_logger = flow_run_logger(flow_run=flow_run)
259
+
260
+ try:
261
+ flow = _load_flow_from_runtime_entrypoint(entrypoint)
262
+ except Exception:
263
+ run_logger.error(
264
+ "Unexpected exception encountered when trying to load flow",
265
+ exc_info=True,
266
+ )
267
+ raise
268
+
269
+ with RunMetrics(flow_run, flow):
270
+ run_result = run_flow(flow, flow_run=flow_run, error_logger=run_logger)
271
+ _drive_run_flow_result(flow, run_result)
272
+
273
+
274
+ def _main(argv: list[str] | None = None) -> int:
275
+ args = sys.argv[1:] if argv is None else argv
276
+ if len(args) != 1:
277
+ _engine_logger.error(
278
+ "Invalid flow entrypoint. Expected one argument; received: %s", args
279
+ )
280
+ return 1
281
+
282
+ flow_run_id_value = os.environ.get("PREFECT__FLOW_RUN_ID")
283
+ try:
284
+ flow_run_id = UUID(flow_run_id_value) if flow_run_id_value else None
285
+ except ValueError:
286
+ flow_run_id = None
287
+
288
+ if flow_run_id is None:
289
+ _engine_logger.error(
290
+ "Invalid flow run id. Expected PREFECT__FLOW_RUN_ID to contain a UUID."
291
+ )
292
+ return 1
293
+
294
+ _run_flow_from_runtime_entrypoint(flow_run_id, args[0])
295
+ return 0
296
+
297
+
245
298
  @contextmanager
246
299
  def _send_heartbeats(
247
300
  engine: "BaseFlowRunEngine[Any, Any]",
@@ -602,6 +655,32 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
602
655
  )
603
656
  self.short_circuit = True
604
657
 
658
+ if (
659
+ not self.short_circuit
660
+ and not self._flow_run_name_set
661
+ and self.flow.flow_run_name
662
+ ):
663
+ if self.flow_run is None:
664
+ raise ValueError("Flow run not set")
665
+
666
+ with FlowRunContext(
667
+ flow=self.flow,
668
+ flow_run=self.flow_run,
669
+ parameters=self.parameters,
670
+ client=self.client,
671
+ task_runner=self.flow.task_runner,
672
+ result_store=get_result_store().update_for_flow(self.flow, _sync=True),
673
+ ):
674
+ flow_run_name = resolve_custom_flow_run_name(
675
+ flow=self.flow, parameters=self.parameters or {}
676
+ )
677
+ self.client.set_flow_run_name(
678
+ flow_run_id=self.flow_run.id, name=flow_run_name
679
+ )
680
+ self.flow_run.name = flow_run_name
681
+ self._flow_run_name_set = True
682
+ self._telemetry.update_run_name(name=flow_run_name)
683
+
605
684
  new_state = Running()
606
685
  state = self.set_state(new_state)
607
686
  while state.is_pending():
@@ -927,6 +1006,12 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
927
1006
  if log_prints:
928
1007
  stack.enter_context(patch_print())
929
1008
  task_runner = stack.enter_context(self.flow.task_runner.duplicate())
1009
+ result_store = get_result_store().update_for_flow(self.flow, _sync=True)
1010
+ persist_result = (
1011
+ self.flow.persist_result
1012
+ if self.flow.persist_result is not None
1013
+ else _get_default_persist_result()
1014
+ )
930
1015
  stack.enter_context(
931
1016
  FlowRunContext(
932
1017
  flow=self.flow,
@@ -934,13 +1019,9 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
934
1019
  flow_run=self.flow_run,
935
1020
  parameters=self.parameters,
936
1021
  client=client,
937
- result_store=get_result_store().update_for_flow(
938
- self.flow, _sync=True
939
- ),
1022
+ result_store=result_store,
940
1023
  task_runner=task_runner,
941
- persist_result=self.flow.persist_result
942
- if self.flow.persist_result is not None
943
- else should_persist_result(),
1024
+ persist_result=persist_result,
944
1025
  )
945
1026
  )
946
1027
  # Set deployment context vars only if this is the top-level deployment run
@@ -1248,6 +1329,32 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1248
1329
  )
1249
1330
  self.short_circuit = True
1250
1331
 
1332
+ if (
1333
+ not self.short_circuit
1334
+ and not self._flow_run_name_set
1335
+ and self.flow.flow_run_name
1336
+ ):
1337
+ if self.flow_run is None:
1338
+ raise ValueError("Flow run not set")
1339
+
1340
+ with FlowRunContext(
1341
+ flow=self.flow,
1342
+ flow_run=self.flow_run,
1343
+ parameters=self.parameters,
1344
+ client=self.client,
1345
+ task_runner=self.flow.task_runner,
1346
+ result_store=get_result_store().update_for_flow(self.flow, _sync=True),
1347
+ ):
1348
+ flow_run_name = resolve_custom_flow_run_name(
1349
+ flow=self.flow, parameters=self.parameters or {}
1350
+ )
1351
+ await self.client.set_flow_run_name(
1352
+ flow_run_id=self.flow_run.id, name=flow_run_name
1353
+ )
1354
+ self.flow_run.name = flow_run_name
1355
+ self._flow_run_name_set = True
1356
+ self._telemetry.update_run_name(name=flow_run_name)
1357
+
1251
1358
  new_state = Running()
1252
1359
  state = await self.set_state(new_state)
1253
1360
  while state.is_pending():
@@ -1566,6 +1673,12 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1566
1673
  if log_prints:
1567
1674
  stack.enter_context(patch_print())
1568
1675
  task_runner = stack.enter_context(self.flow.task_runner.duplicate())
1676
+ result_store = get_result_store().update_for_flow(self.flow, _sync=True)
1677
+ persist_result = (
1678
+ self.flow.persist_result
1679
+ if self.flow.persist_result is not None
1680
+ else await _aget_default_persist_result()
1681
+ )
1569
1682
  stack.enter_context(
1570
1683
  FlowRunContext(
1571
1684
  flow=self.flow,
@@ -1573,13 +1686,9 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1573
1686
  flow_run=self.flow_run,
1574
1687
  parameters=self.parameters,
1575
1688
  client=client,
1576
- result_store=get_result_store().update_for_flow(
1577
- self.flow, _sync=True
1578
- ),
1689
+ result_store=result_store,
1579
1690
  task_runner=task_runner,
1580
- persist_result=self.flow.persist_result
1581
- if self.flow.persist_result is not None
1582
- else should_persist_result(),
1691
+ persist_result=persist_result,
1583
1692
  )
1584
1693
  )
1585
1694
  # Set deployment context vars only if this is the top-level deployment run
@@ -2119,3 +2228,7 @@ def run_flow_in_subprocess(
2119
2228
  process.start()
2120
2229
 
2121
2230
  return process
2231
+
2232
+
2233
+ if __name__ == "__main__":
2234
+ raise SystemExit(_main())