prefect-client 3.7.1.dev9__tar.gz → 3.7.2__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 (448) hide show
  1. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/PKG-INFO +1 -1
  2. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/AGENTS.md +2 -1
  3. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/__init__.py +5 -0
  4. prefect_client-3.7.2/src/prefect/_build_info.py +5 -0
  5. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/automations.py +2 -0
  6. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/notifications.py +18 -2
  7. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/__init__.py +16 -1
  8. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_zip_builder.py +32 -25
  9. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/_leases.py +10 -2
  10. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/__init__.py +2 -0
  11. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/actions.py +7 -0
  12. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/clients.py +1 -1
  13. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/subscribers.py +1 -1
  14. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/flow_engine.py +64 -44
  15. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/handlers.py +6 -3
  16. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/results.py +4 -0
  17. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_scheduled_run_poller.py +5 -10
  18. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/runner.py +17 -19
  19. prefect_client-3.7.2/src/prefect/server/api/_ui_static.py +85 -0
  20. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/clients.py +3 -0
  21. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/server.py +4 -22
  22. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/work_queues.py +18 -1
  23. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/workers.py +366 -17
  24. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/sources.py +7 -1
  25. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/_datetime.py +30 -1
  26. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/templating/__init__.py +146 -92
  27. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/_protocol.py +4 -0
  28. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/_sync.py +31 -11
  29. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/base.py +1 -3
  30. prefect_client-3.7.1.dev9/src/prefect/_build_info.py +0 -5
  31. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/.gitignore +0 -0
  32. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/LICENSE +0 -0
  33. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/README.md +0 -0
  34. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/hatch_build.py +0 -0
  35. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/pyproject.toml +0 -0
  36. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/.prefectignore +0 -0
  37. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/__main__.py +0 -0
  38. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/__init__.py +0 -0
  39. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/_launchers.py +0 -0
  40. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/bundles/__init__.py +0 -0
  41. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/bundles/execute.py +0 -0
  42. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/__init__.py +0 -0
  43. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/apply.py +0 -0
  44. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  45. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/manager.py +0 -0
  46. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/spec.py +0 -0
  47. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/sla/__init__.py +0 -0
  48. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/sla/client.py +0 -0
  49. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/sla/objects.py +0 -0
  50. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_flow_run_suspension.py +0 -0
  51. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/__init__.py +0 -0
  52. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/_logging.py +0 -0
  53. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/__init__.py +0 -0
  54. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  55. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/client.py +0 -0
  56. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/device_id.py +0 -0
  57. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/emit.py +0 -0
  58. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/enabled.py +0 -0
  59. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/events.py +0 -0
  60. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/milestones.py +0 -0
  61. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/notice.py +0 -0
  62. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/service.py +0 -0
  63. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/ast_utils.py +0 -0
  64. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/buildx.py +0 -0
  65. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/__init__.py +0 -0
  66. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  67. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/backports.py +0 -0
  68. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/blocks.py +0 -0
  69. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  70. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  71. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/migration.py +0 -0
  72. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/starlette.py +0 -0
  73. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/__init__.py +0 -0
  74. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/api.py +0 -0
  75. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/calls.py +0 -0
  76. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  77. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  78. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/inspection.py +0 -0
  79. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/primitives.py +0 -0
  80. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/services.py +0 -0
  81. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/threads.py +0 -0
  82. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/waiters.py +0 -0
  83. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/control_listener.py +0 -0
  84. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/deprecated.py +0 -0
  85. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/engine.py +0 -0
  86. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/git.py +0 -0
  87. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  88. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/installation.py +0 -0
  89. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/integrations.py +0 -0
  90. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/launchers.py +0 -0
  91. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/lazy.py +0 -0
  92. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/metrics.py +0 -0
  93. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/observability.py +0 -0
  94. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/observers.py +0 -0
  95. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/__init__.py +0 -0
  96. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/apply.py +0 -0
  97. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/collections.py +0 -0
  98. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  99. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/manager.py +0 -0
  100. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/spec.py +0 -0
  101. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/startup.py +0 -0
  102. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/__init__.py +0 -0
  103. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/schemas.py +0 -0
  104. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  105. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  106. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  107. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pytz.py +0 -0
  108. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/result_records.py +0 -0
  109. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/retries.py +0 -0
  110. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schema.py +0 -0
  111. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/__init__.py +0 -0
  112. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/bases.py +0 -0
  113. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/fields.py +0 -0
  114. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/serializers.py +0 -0
  115. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/validators.py +0 -0
  116. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  117. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/states.py +0 -0
  118. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/testing.py +0 -0
  119. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/urls.py +0 -0
  120. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/uuid7.py +0 -0
  121. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/version_checking.py +0 -0
  122. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/versioning.py +0 -0
  123. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/waiters.py +0 -0
  124. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/websockets.py +0 -0
  125. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/__init__.py +0 -0
  126. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/fetcher.py +0 -0
  127. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/generator.py +0 -0
  128. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/models.py +0 -0
  129. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/naming.py +0 -0
  130. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/renderer.py +0 -0
  131. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/schema_converter.py +0 -0
  132. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/templates/__init__.py +0 -0
  133. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  134. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/types.py +0 -0
  135. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/unions.py +0 -0
  136. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_vendor/croniter/__init__.py +0 -0
  137. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_vendor/croniter/croniter.py +0 -0
  138. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/agent.py +0 -0
  139. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/analytics/__init__.py +0 -0
  140. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/artifacts.py +0 -0
  141. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/assets/__init__.py +0 -0
  142. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/assets/core.py +0 -0
  143. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/assets/materialize.py +0 -0
  144. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/AGENTS.md +0 -0
  145. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/__init__.py +0 -0
  146. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/abstract.py +0 -0
  147. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/core.py +0 -0
  148. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/fields.py +0 -0
  149. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/redis.py +0 -0
  150. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/system.py +0 -0
  151. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/webhook.py +0 -0
  152. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_file_collector.py +0 -0
  153. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_ignore_filter.py +0 -0
  154. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_path_resolver.py +0 -0
  155. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_zip_extractor.py +0 -0
  156. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/execute.py +0 -0
  157. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/cache_policies.py +0 -0
  158. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/AGENTS.md +0 -0
  159. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/__init__.py +0 -0
  160. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/attribution.py +0 -0
  161. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/base.py +0 -0
  162. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/cloud.py +0 -0
  163. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/collections.py +0 -0
  164. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/constants.py +0 -0
  165. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/__init__.py +0 -0
  166. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  167. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  168. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  169. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_automations/client.py +0 -0
  170. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  171. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  172. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  173. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  174. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  175. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  176. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  177. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  178. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  179. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  180. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  181. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_events/client.py +0 -0
  182. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  183. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  184. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  185. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_flows/client.py +0 -0
  186. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  187. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_logs/client.py +0 -0
  188. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  189. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_variables/client.py +0 -0
  190. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  191. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  192. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/base.py +0 -0
  193. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/routes.py +0 -0
  194. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/__init__.py +0 -0
  195. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/actions.py +0 -0
  196. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/events.py +0 -0
  197. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/filters.py +0 -0
  198. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/objects.py +0 -0
  199. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/responses.py +0 -0
  200. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/schedules.py +0 -0
  201. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/sorting.py +0 -0
  202. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/worker_channel.py +0 -0
  203. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/subscriptions.py +0 -0
  204. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/types/__init__.py +0 -0
  205. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  206. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/utilities.py +0 -0
  207. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/AGENTS.md +0 -0
  208. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/__init__.py +0 -0
  209. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/_asyncio.py +0 -0
  210. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/_events.py +0 -0
  211. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/_sync.py +0 -0
  212. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/asyncio.py +0 -0
  213. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/context.py +0 -0
  214. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/services.py +0 -0
  215. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/sync.py +0 -0
  216. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/__init__.py +0 -0
  217. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  218. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/_events.py +0 -0
  219. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/asyncio.py +0 -0
  220. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/context.py +0 -0
  221. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/services.py +0 -0
  222. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/sync.py +0 -0
  223. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/context.py +0 -0
  224. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/AGENTS.md +0 -0
  225. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/__init__.py +0 -0
  226. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/base.py +0 -0
  227. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/deployments.py +0 -0
  228. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/flow_runs.py +0 -0
  229. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/runner.py +0 -0
  230. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/schedules.py +0 -0
  231. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/steps/__init__.py +0 -0
  232. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/steps/core.py +0 -0
  233. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/steps/pull.py +0 -0
  234. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/steps/utility.py +0 -0
  235. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/docker/__init__.py +0 -0
  236. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/docker/_buildx.py +0 -0
  237. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/docker/docker_image.py +0 -0
  238. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/engine.py +0 -0
  239. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/AGENTS.md +0 -0
  240. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/filters.py +0 -0
  241. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/related.py +0 -0
  242. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/__init__.py +0 -0
  243. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/automations.py +0 -0
  244. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  245. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/events.py +0 -0
  246. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/labelling.py +0 -0
  247. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/utilities.py +0 -0
  248. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/worker.py +0 -0
  249. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/exceptions.py +0 -0
  250. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/filesystems.py +0 -0
  251. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/flow_runs.py +0 -0
  252. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/flows.py +0 -0
  253. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/futures.py +0 -0
  254. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/__init__.py +0 -0
  255. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/base.py +0 -0
  256. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  257. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  258. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  259. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  260. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  261. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  262. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/input/__init__.py +0 -0
  263. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/input/actions.py +0 -0
  264. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/input/run_input.py +0 -0
  265. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/__init__.py +0 -0
  266. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/_filelock.py +0 -0
  267. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/filesystem.py +0 -0
  268. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/memory.py +0 -0
  269. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/protocol.py +0 -0
  270. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/AGENTS.md +0 -0
  271. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/__init__.py +0 -0
  272. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/clients.py +0 -0
  273. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/configuration.py +0 -0
  274. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/filters.py +0 -0
  275. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/formatters.py +0 -0
  276. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/highlighters.py +0 -0
  277. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/loggers.py +0 -0
  278. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/logging.yml +0 -0
  279. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/main.py +0 -0
  280. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/plugins.py +0 -0
  281. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/py.typed +0 -0
  282. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/AGENTS.md +0 -0
  283. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/__init__.py +0 -0
  284. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_cancel_finalizer.py +0 -0
  285. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_cancellation_manager.py +0 -0
  286. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_control_channel.py +0 -0
  287. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_deployment_registry.py +0 -0
  288. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_event_emitter.py +0 -0
  289. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_flow_resolver.py +0 -0
  290. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_flow_run_executor.py +0 -0
  291. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_hook_runner.py +0 -0
  292. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_limit_manager.py +0 -0
  293. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_process_manager.py +0 -0
  294. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_starter_bundle.py +0 -0
  295. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_starter_direct.py +0 -0
  296. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_starter_engine.py +0 -0
  297. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_state_proposer.py +0 -0
  298. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_workspace_resolver.py +0 -0
  299. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_workspace_starter.py +0 -0
  300. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/server.py +0 -0
  301. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/storage.py +0 -0
  302. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runtime/__init__.py +0 -0
  303. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runtime/deployment.py +0 -0
  304. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runtime/flow_run.py +0 -0
  305. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runtime/task_run.py +0 -0
  306. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/schedules.py +0 -0
  307. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/serializers.py +0 -0
  308. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/__init__.py +0 -0
  309. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/admin.py +0 -0
  310. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/artifacts.py +0 -0
  311. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/automations.py +0 -0
  312. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/background_workers.py +0 -0
  313. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/block_capabilities.py +0 -0
  314. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/block_documents.py +0 -0
  315. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/block_schemas.py +0 -0
  316. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/block_types.py +0 -0
  317. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/collections.py +0 -0
  318. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  319. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/concurrency_limits.py +0 -0
  320. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  321. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/csrf_token.py +0 -0
  322. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/dependencies.py +0 -0
  323. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/deployments.py +0 -0
  324. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/events.py +0 -0
  325. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/flow_run_states.py +0 -0
  326. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/flow_runs.py +0 -0
  327. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/flows.py +0 -0
  328. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/logs.py +0 -0
  329. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/middleware.py +0 -0
  330. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/root.py +0 -0
  331. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/run_history.py +0 -0
  332. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/saved_searches.py +0 -0
  333. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  334. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/task_run_states.py +0 -0
  335. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/task_runs.py +0 -0
  336. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/task_workers.py +0 -0
  337. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/templates.py +0 -0
  338. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/__init__.py +0 -0
  339. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/flow_runs.py +0 -0
  340. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/flows.py +0 -0
  341. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/schemas.py +0 -0
  342. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/task_runs.py +0 -0
  343. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/validation.py +0 -0
  344. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/variables.py +0 -0
  345. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/AGENTS.md +0 -0
  346. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/__init__.py +0 -0
  347. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/base.py +0 -0
  348. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/constants.py +0 -0
  349. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/context.py +0 -0
  350. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/legacy.py +0 -0
  351. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/__init__.py +0 -0
  352. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/_defaults.py +0 -0
  353. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/api.py +0 -0
  354. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/cli.py +0 -0
  355. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/client.py +0 -0
  356. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/cloud.py +0 -0
  357. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/deployments.py +0 -0
  358. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/events.py +0 -0
  359. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/experiments.py +0 -0
  360. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/flows.py +0 -0
  361. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/internal.py +0 -0
  362. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/logging.py +0 -0
  363. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/plugins.py +0 -0
  364. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/results.py +0 -0
  365. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/root.py +0 -0
  366. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/runner.py +0 -0
  367. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/__init__.py +0 -0
  368. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/api.py +0 -0
  369. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/concurrency.py +0 -0
  370. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/database.py +0 -0
  371. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/deployments.py +0 -0
  372. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/docket.py +0 -0
  373. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/ephemeral.py +0 -0
  374. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/events.py +0 -0
  375. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  376. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/logs.py +0 -0
  377. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/root.py +0 -0
  378. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/services.py +0 -0
  379. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/tasks.py +0 -0
  380. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/ui.py +0 -0
  381. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/tasks.py +0 -0
  382. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/telemetry.py +0 -0
  383. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/testing.py +0 -0
  384. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/worker.py +0 -0
  385. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/profiles.py +0 -0
  386. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/profiles.toml +0 -0
  387. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/states.py +0 -0
  388. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/task_engine.py +0 -0
  389. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/task_runners.py +0 -0
  390. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/task_runs.py +0 -0
  391. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/task_worker.py +0 -0
  392. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/tasks.py +0 -0
  393. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/telemetry/__init__.py +0 -0
  394. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/telemetry/run_telemetry.py +0 -0
  395. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/transactions.py +0 -0
  396. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/__init__.py +0 -0
  397. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/_concurrency.py +0 -0
  398. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/entrypoint.py +0 -0
  399. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/names.py +0 -0
  400. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/AGENTS.md +0 -0
  401. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/__init__.py +0 -0
  402. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/annotations.py +0 -0
  403. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  404. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  405. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/callables/AGENTS.md +0 -0
  406. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/callables/__init__.py +0 -0
  407. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/collections.py +0 -0
  408. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/compat.py +0 -0
  409. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/context.py +0 -0
  410. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/dispatch.py +0 -0
  411. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/dockerutils.py +0 -0
  412. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/engine/AGENTS.md +0 -0
  413. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/engine/__init__.py +0 -0
  414. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  415. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/filesystem/__init__.py +0 -0
  416. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/generics.py +0 -0
  417. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/hashing.py +0 -0
  418. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/importtools.py +0 -0
  419. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/math.py +0 -0
  420. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/names.py +0 -0
  421. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  422. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/processutils/__init__.py +0 -0
  423. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/pydantic.py +0 -0
  424. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/render_swagger.py +0 -0
  425. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  426. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  427. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  428. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/schema_tools/validation.py +0 -0
  429. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/services.py +0 -0
  430. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/slugify.py +0 -0
  431. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/templating/AGENTS.md +0 -0
  432. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/text.py +0 -0
  433. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/timeout.py +0 -0
  434. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/urls.py +0 -0
  435. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/visualization.py +0 -0
  436. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/variables.py +0 -0
  437. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/AGENTS.md +0 -0
  438. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/__init__.py +0 -0
  439. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_cleanup.py +0 -0
  440. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_cleanup_handlers.py +0 -0
  441. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  442. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/_state.py +0 -0
  443. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  444. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/block.py +0 -0
  445. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/cloud.py +0 -0
  446. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/process.py +0 -0
  447. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/server.py +0 -0
  448. {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/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.7.1.dev9
3
+ Version: 3.7.2
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
@@ -23,13 +23,14 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
23
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
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.
25
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.
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.
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. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. 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.
27
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.
28
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.
29
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.
30
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
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
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.
33
+ - **Result storage resolves through three tiers, potentially making an API call.** `get_default_result_storage()` checks: (1) `PREFECT_DEFAULT_RESULT_STORAGE_BLOCK` setting, (2) server-configured default block (API call to the server's Configuration store), (3) local storage path. The API call is silently suppressed on any HTTP error. Engines use `_get_default_persist_result()` — not `should_persist_result()` — at context setup time to auto-enable persistence when a server default block is configured. Do not swap `_get_default_persist_result()` back to `should_persist_result()` in engine initialization paths; `should_persist_result()` does not consult the server default.
33
34
  - **`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.
34
35
  - **Flow-run suspension is enforced at orchestration boundaries.** Suspension is delivered via `FlowRunSuspensionRequest` and raised with `raise_if_flow_run_suspension_requested()`. When changing engines, futures, task runners, or generator execution, check before returning control to flow user code or proposing a flow state that could leave `Suspended`; keep sync/async paths aligned and avoid per-boundary API reads.
35
36
 
@@ -113,6 +113,11 @@ def _initialize_plugins() -> None:
113
113
  # Re-raise SystemExit from strict mode
114
114
  raise
115
115
  except Exception as e:
116
+ from pydantic_settings.exceptions import SettingsError
117
+
118
+ if isinstance(e, SettingsError):
119
+ return
120
+
116
121
  # Log but don't crash on plugin errors
117
122
  try:
118
123
  from prefect.logging import get_logger
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.7.2"
3
+ __build_date__ = "2026-05-23 00:21:39.748528+00:00"
4
+ __git_commit__ = "5836855ecd0a9924117d212bad5308a8a89ab97d"
5
+ __dirty__ = False
@@ -11,6 +11,7 @@ from prefect.events.actions import (
11
11
  CancelFlowRun,
12
12
  ChangeFlowRunState,
13
13
  DeclareIncident,
14
+ DeleteFlowRun,
14
15
  DoNothing,
15
16
  PauseAutomation,
16
17
  PauseDeployment,
@@ -61,6 +62,7 @@ __all__ = [
61
62
  "PauseDeployment",
62
63
  "ResumeDeployment",
63
64
  "CancelFlowRun",
65
+ "DeleteFlowRun",
64
66
  "ChangeFlowRunState",
65
67
  "PauseWorkQueue",
66
68
  "ResumeWorkQueue",
@@ -57,7 +57,15 @@ class AbstractAppriseNotificationBlock(NotificationBlock, ABC):
57
57
  body: str,
58
58
  subject: str | None = None,
59
59
  ) -> None:
60
- with LogEavesdropper("apprise", level=logging.DEBUG) as eavesdropper:
60
+ apprise_logger = logging.getLogger("apprise")
61
+ root_logger = logging.getLogger()
62
+
63
+ if apprise_logger.level == logging.NOTSET:
64
+ log_level = root_logger.getEffectiveLevel()
65
+ else:
66
+ log_level = max(apprise_logger.level, root_logger.getEffectiveLevel())
67
+
68
+ with LogEavesdropper("apprise", level=log_level) as eavesdropper:
61
69
  result = await self._apprise_client.async_notify( # pyright: ignore[reportUnknownMemberType] incomplete type hints in apprise
62
70
  body=body,
63
71
  title=subject or "",
@@ -72,7 +80,15 @@ class AbstractAppriseNotificationBlock(NotificationBlock, ABC):
72
80
  body: str,
73
81
  subject: str | None = None,
74
82
  ) -> None:
75
- with LogEavesdropper("apprise", level=logging.DEBUG) as eavesdropper:
83
+ apprise_logger = logging.getLogger("apprise")
84
+ root_logger = logging.getLogger()
85
+
86
+ if apprise_logger.level == logging.NOTSET:
87
+ log_level = root_logger.getEffectiveLevel()
88
+ else:
89
+ log_level = max(apprise_logger.level, root_logger.getEffectiveLevel())
90
+
91
+ with LogEavesdropper("apprise", level=log_level) as eavesdropper:
76
92
  result = self._apprise_client.notify( # pyright: ignore[reportUnknownMemberType] incomplete type hints in apprise
77
93
  body=body,
78
94
  title=subject or "",
@@ -593,8 +593,23 @@ def execute_bundle_in_subprocess(
593
593
 
594
594
  # Install dependencies if necessary
595
595
  if dependencies := bundle.get("dependencies"):
596
+ dep_lines = [line.strip() for line in dependencies.split("\n") if line.strip()]
597
+ validated_deps: list[str] = []
598
+ for dep_line in dep_lines:
599
+ if dep_line.startswith("-"):
600
+ raise ValueError(
601
+ f"Invalid dependency (command-line flags are not allowed): {dep_line!r}"
602
+ )
603
+ try:
604
+ Requirement(dep_line)
605
+ except InvalidRequirement as e:
606
+ raise ValueError(
607
+ f"Invalid PEP 508 dependency specifier: {dep_line!r}"
608
+ ) from e
609
+ validated_deps.append(dep_line)
610
+
596
611
  subprocess.check_call(
597
- [_get_uv_path(), "pip", "install", *dependencies.split("\n")],
612
+ [_get_uv_path(), "pip", "install", *validated_deps],
598
613
  # Copy the current environment to ensure we install into the correct venv
599
614
  env=os.environ,
600
615
  )
@@ -11,6 +11,7 @@ from __future__ import annotations
11
11
  import hashlib
12
12
  import logging
13
13
  import shutil
14
+ import struct
14
15
  import tempfile
15
16
  import zipfile
16
17
  from dataclasses import dataclass
@@ -32,7 +33,8 @@ class ZipResult:
32
33
 
33
34
  Attributes:
34
35
  zip_path: Path to the temporary zip file.
35
- sha256_hash: Lowercase hex digest of the zip content.
36
+ sha256_hash: SHA256 hex digest of the canonical bundled file contents
37
+ (paths, modes, and bytes), not the raw zip archive bytes.
36
38
  storage_key: Content-addressed storage key in format "files/{hash}.zip".
37
39
  size_bytes: Size of the zip file in bytes.
38
40
  """
@@ -95,16 +97,40 @@ class ZipBuilder:
95
97
  self._temp_dir = tempfile.mkdtemp(prefix="prefect-zip-")
96
98
  zip_path = Path(self._temp_dir) / "files.zip"
97
99
 
98
- # Build the zip with DEFLATED compression
100
+ # Build the zip and compute the content hash in a single pass so
101
+ # that every file is read exactly once, avoiding race conditions
102
+ # where a source file could change between the zip write and the
103
+ # hash computation.
104
+ hasher = hashlib.sha256()
105
+ hasher.update(b"prefect-bundle-files-v1\0")
106
+
99
107
  with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as zf:
100
108
  for file_path in sorted_files:
101
- # Compute relative path with forward slashes
102
109
  rel_path = file_path.relative_to(self.base_dir)
103
110
  arcname = str(rel_path).replace("\\", "/")
104
- zf.write(file_path, arcname)
105
111
 
106
- # Compute SHA256 hash using chunked reading
107
- sha256_hash = self._compute_hash(zip_path)
112
+ file_stat = file_path.stat()
113
+
114
+ arcname_bytes = arcname.encode("utf-8")
115
+ hasher.update(struct.pack(">I", len(arcname_bytes)))
116
+ hasher.update(arcname_bytes)
117
+ hasher.update(struct.pack(">I", file_stat.st_mode & 0xFFFF))
118
+ hasher.update(struct.pack(">Q", file_stat.st_size))
119
+
120
+ zip_info = zipfile.ZipInfo.from_file(file_path, arcname)
121
+ zip_info.compress_type = zipfile.ZIP_DEFLATED
122
+ with (
123
+ file_path.open("rb") as src,
124
+ zf.open(zip_info, "w") as dest,
125
+ ):
126
+ while True:
127
+ chunk = src.read(HASH_CHUNK_SIZE)
128
+ if not chunk:
129
+ break
130
+ dest.write(chunk)
131
+ hasher.update(chunk)
132
+
133
+ sha256_hash = hasher.hexdigest()
108
134
 
109
135
  # Get file size
110
136
  size_bytes = zip_path.stat().st_size
@@ -123,25 +149,6 @@ class ZipBuilder:
123
149
  size_bytes=size_bytes,
124
150
  )
125
151
 
126
- def _compute_hash(self, zip_path: Path) -> str:
127
- """
128
- Compute SHA256 hash of a file using chunked reading.
129
-
130
- Args:
131
- zip_path: Path to the file to hash.
132
-
133
- Returns:
134
- Lowercase hex digest of the SHA256 hash.
135
- """
136
- hasher = hashlib.sha256()
137
- with open(zip_path, "rb") as f:
138
- while True:
139
- chunk = f.read(HASH_CHUNK_SIZE)
140
- if not chunk:
141
- break
142
- hasher.update(chunk)
143
- return hasher.hexdigest()
144
-
145
152
  def _emit_size_warning(
146
153
  self, zip_path: Path, files: list[Path], size_bytes: int
147
154
  ) -> None:
@@ -143,9 +143,14 @@ def _start_lease_renewal_thread(
143
143
  stop_event = threading.Event()
144
144
  renewal_ctx = contextvars.copy_context()
145
145
 
146
- def renewal_loop() -> None:
146
+ def _run_with_failure_handler() -> None:
147
+ # Runs inside renewal_ctx so the failure handler also sees the
148
+ # copied flow/task run contextvars; otherwise get_run_logger() in
149
+ # _handle_lease_renewal_failure can't find the run context and the
150
+ # message falls back to the plain "prefect.concurrency" logger,
151
+ # never reaching the run logs API.
147
152
  try:
148
- renewal_ctx.run(_lease_renewal_loop, lease_id, lease_duration, stop_event)
153
+ _lease_renewal_loop(lease_id, lease_duration, stop_event)
149
154
  except Exception as exc:
150
155
  if not stop_event.is_set():
151
156
  _handle_lease_renewal_failure(
@@ -156,6 +161,9 @@ def _start_lease_renewal_thread(
156
161
  cancel_scope,
157
162
  )
158
163
 
164
+ def renewal_loop() -> None:
165
+ renewal_ctx.run(_run_with_failure_handler)
166
+
159
167
  thread = threading.Thread(
160
168
  target=renewal_loop,
161
169
  daemon=True,
@@ -31,6 +31,7 @@ from .actions import (
31
31
  ResumeDeployment,
32
32
  ChangeFlowRunState,
33
33
  CancelFlowRun,
34
+ DeleteFlowRun,
34
35
  SuspendFlowRun,
35
36
  CallWebhook,
36
37
  SendNotification,
@@ -78,6 +79,7 @@ __all__ = [
78
79
  "ResumeDeployment",
79
80
  "ChangeFlowRunState",
80
81
  "CancelFlowRun",
82
+ "DeleteFlowRun",
81
83
  "SuspendFlowRun",
82
84
  "CallWebhook",
83
85
  "SendNotification",
@@ -126,6 +126,12 @@ class CancelFlowRun(Action):
126
126
  type: Literal["cancel-flow-run"] = "cancel-flow-run"
127
127
 
128
128
 
129
+ class DeleteFlowRun(Action):
130
+ """Deletes a flow run associated with the trigger"""
131
+
132
+ type: Literal["delete-flow-run"] = "delete-flow-run"
133
+
134
+
129
135
  class ResumeFlowRun(Action):
130
136
  """Resumes a flow run associated with the trigger"""
131
137
 
@@ -294,6 +300,7 @@ ActionTypes: TypeAlias = Union[
294
300
  ResumeDeployment,
295
301
  ResumeFlowRun,
296
302
  CancelFlowRun,
303
+ DeleteFlowRun,
297
304
  ChangeFlowRunState,
298
305
  PauseWorkQueue,
299
306
  ResumeWorkQueue,
@@ -31,7 +31,7 @@ from websockets.exceptions import (
31
31
  import prefect.types._datetime
32
32
  from prefect._internal.version_checking import check_server_version
33
33
  from prefect._internal.websockets import websocket_connect
34
- from prefect.events import Event
34
+ from prefect.events.schemas.events import Event
35
35
  from prefect.logging import get_logger
36
36
  from prefect.settings import (
37
37
  PREFECT_API_KEY,
@@ -13,9 +13,9 @@ from typing_extensions import Self
13
13
 
14
14
  from prefect.client.schemas.filters import LogFilter, LogFilterFlowRunId
15
15
  from prefect.client.schemas.objects import TERMINAL_STATES, Log, StateType
16
- from prefect.events import Event
17
16
  from prefect.events.clients import get_events_subscriber
18
17
  from prefect.events.filters import EventAnyResourceFilter, EventFilter
18
+ from prefect.events.schemas.events import Event
19
19
  from prefect.logging.clients import get_logs_subscriber
20
20
 
21
21
  if TYPE_CHECKING:
@@ -909,10 +909,15 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
909
909
  This method attempts to load an existing flow run for a subflow task
910
910
  run, if appropriate.
911
911
 
912
- If the parent task run is in a final but not COMPLETED state, and not
913
- being rerun, then we attempt to load an existing flow run instead of
914
- creating a new one. This will prevent the engine from running the
915
- subflow again.
912
+ If the parent task run is in a final state, we return the existing
913
+ subflow run to avoid re-execution (unless the parent is being rerun
914
+ and the subflow did not complete, in which case a fresh run is
915
+ desired).
916
+
917
+ If the parent task run is in a non-final state (e.g. still Running
918
+ after a process restart), we also look for an existing subflow run
919
+ to reattach to, preventing duplicate subflow runs from being created
920
+ under the same parent task run.
916
921
 
917
922
  If no existing flow run is found, or if the subflow should be rerun,
918
923
  then no flow run is returned.
@@ -926,27 +931,32 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
926
931
  else False
927
932
  )
928
933
 
929
- # if the parent task run is in a final but not completed state, and
930
- # not rerunning, then retrieve the most recent flow run instead of
931
- # creating a new one. This effectively loads a cached flow run for
932
- # situations where we are confident the flow should not be run
933
- # again.
934
934
  assert isinstance(parent_task_run.state, State)
935
- if parent_task_run.state.is_final() and not (
936
- rerunning and not parent_task_run.state.is_completed()
935
+
936
+ # If the user explicitly triggered a re-run and the subflow did not
937
+ # complete, allow a fresh subflow to be created.
938
+ if (
939
+ parent_task_run.state.is_final()
940
+ and rerunning
941
+ and not parent_task_run.state.is_completed()
937
942
  ):
938
- # return the most recent flow run, if it exists
939
- flow_runs = client.read_flow_runs(
940
- flow_run_filter=FlowRunFilter(
941
- parent_task_run_id={"any_": [parent_task_run.id]}
942
- ),
943
- sort=FlowRunSort.EXPECTED_START_TIME_ASC,
944
- limit=1,
945
- )
946
- if flow_runs:
947
- loaded_flow_run = flow_runs[-1]
943
+ return None
944
+
945
+ # Look for an existing subflow run attached to this parent task run.
946
+ flow_runs = client.read_flow_runs(
947
+ flow_run_filter=FlowRunFilter(
948
+ parent_task_run_id={"any_": [parent_task_run.id]}
949
+ ),
950
+ sort=FlowRunSort.EXPECTED_START_TIME_DESC,
951
+ limit=1,
952
+ )
953
+ if flow_runs:
954
+ loaded_flow_run = flow_runs[0]
955
+ # When the parent task run is final the subflow has already
956
+ # finished; cache the result so the engine skips re-execution.
957
+ if parent_task_run.state.is_final():
948
958
  self._return_value = loaded_flow_run.state
949
- return loaded_flow_run
959
+ return loaded_flow_run
950
960
 
951
961
  def create_flow_run(self, client: SyncPrefectClient) -> FlowRun:
952
962
  flow_run_ctx = FlowRunContext.get()
@@ -1594,10 +1604,15 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1594
1604
  This method attempts to load an existing flow run for a subflow task
1595
1605
  run, if appropriate.
1596
1606
 
1597
- If the parent task run is in a final but not COMPLETED state, and not
1598
- being rerun, then we attempt to load an existing flow run instead of
1599
- creating a new one. This will prevent the engine from running the
1600
- subflow again.
1607
+ If the parent task run is in a final state, we return the existing
1608
+ subflow run to avoid re-execution (unless the parent is being rerun
1609
+ and the subflow did not complete, in which case a fresh run is
1610
+ desired).
1611
+
1612
+ If the parent task run is in a non-final state (e.g. still Running
1613
+ after a process restart), we also look for an existing subflow run
1614
+ to reattach to, preventing duplicate subflow runs from being created
1615
+ under the same parent task run.
1601
1616
 
1602
1617
  If no existing flow run is found, or if the subflow should be rerun,
1603
1618
  then no flow run is returned.
@@ -1611,27 +1626,32 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1611
1626
  else False
1612
1627
  )
1613
1628
 
1614
- # if the parent task run is in a final but not completed state, and
1615
- # not rerunning, then retrieve the most recent flow run instead of
1616
- # creating a new one. This effectively loads a cached flow run for
1617
- # situations where we are confident the flow should not be run
1618
- # again.
1619
1629
  assert isinstance(parent_task_run.state, State)
1620
- if parent_task_run.state.is_final() and not (
1621
- rerunning and not parent_task_run.state.is_completed()
1630
+
1631
+ # If the user explicitly triggered a re-run and the subflow did not
1632
+ # complete, allow a fresh subflow to be created.
1633
+ if (
1634
+ parent_task_run.state.is_final()
1635
+ and rerunning
1636
+ and not parent_task_run.state.is_completed()
1622
1637
  ):
1623
- # return the most recent flow run, if it exists
1624
- flow_runs = await client.read_flow_runs(
1625
- flow_run_filter=FlowRunFilter(
1626
- parent_task_run_id={"any_": [parent_task_run.id]}
1627
- ),
1628
- sort=FlowRunSort.EXPECTED_START_TIME_ASC,
1629
- limit=1,
1630
- )
1631
- if flow_runs:
1632
- loaded_flow_run = flow_runs[-1]
1638
+ return None
1639
+
1640
+ # Look for an existing subflow run attached to this parent task run.
1641
+ flow_runs = await client.read_flow_runs(
1642
+ flow_run_filter=FlowRunFilter(
1643
+ parent_task_run_id={"any_": [parent_task_run.id]}
1644
+ ),
1645
+ sort=FlowRunSort.EXPECTED_START_TIME_DESC,
1646
+ limit=1,
1647
+ )
1648
+ if flow_runs:
1649
+ loaded_flow_run = flow_runs[0]
1650
+ # When the parent task run is final the subflow has already
1651
+ # finished; cache the result so the engine skips re-execution.
1652
+ if parent_task_run.state.is_final():
1633
1653
  self._return_value = loaded_flow_run.state
1634
- return loaded_flow_run
1654
+ return loaded_flow_run
1635
1655
 
1636
1656
  async def create_flow_run(self, client: PrefectClient) -> FlowRun:
1637
1657
  flow_run_ctx = FlowRunContext.get()
@@ -16,7 +16,6 @@ from rich.highlighter import Highlighter, NullHighlighter
16
16
  from rich.theme import Theme
17
17
  from typing_extensions import Self
18
18
 
19
- import prefect.context
20
19
  from prefect._internal.concurrency.api import create_call, from_sync
21
20
  from prefect._internal.concurrency.event_loop import get_running_loop
22
21
  from prefect._internal.concurrency.services import BatchedQueueService
@@ -161,7 +160,9 @@ class APILogHandler(logging.Handler):
161
160
  Send a log to the `APILogWorker`
162
161
  """
163
162
  try:
164
- profile = prefect.context.get_settings_context()
163
+ from prefect.context import get_settings_context
164
+
165
+ profile = get_settings_context()
165
166
 
166
167
  if not profile.settings.logging.to_api.enabled:
167
168
  return # Respect the global settings toggle
@@ -214,7 +215,9 @@ class APILogHandler(logging.Handler):
214
215
 
215
216
  if not flow_run_id:
216
217
  try:
217
- context = prefect.context.get_run_context()
218
+ from prefect.context import get_run_context
219
+
220
+ context = get_run_context()
218
221
  except MissingContextError:
219
222
  raise MissingContextError(
220
223
  f"Logger {record.name!r} attempted to send logs to the API without"
@@ -699,6 +699,8 @@ class ResultStore(BaseModel):
699
699
  except Exception:
700
700
  return False
701
701
  else:
702
+ if self.result_storage is None:
703
+ self.result_storage = await aget_default_result_storage()
702
704
  try:
703
705
  content = await call_explicitly_async_block_method(
704
706
  self.result_storage, "read_path", (key,), {}
@@ -742,6 +744,8 @@ class ResultStore(BaseModel):
742
744
  except Exception:
743
745
  return False
744
746
  else:
747
+ if self.result_storage is None:
748
+ self.result_storage = get_default_result_storage(_sync=True)
745
749
  try:
746
750
  content = call_explicitly_sync_block_method(
747
751
  self.result_storage, "read_path", (key,), {}
@@ -126,7 +126,6 @@ class ScheduledRunPoller:
126
126
  ),
127
127
  )
128
128
 
129
- submitted_ids: set[UUID] = set()
130
129
  for flow_run in submittable_flow_runs:
131
130
  if flow_run.id in self._submitting_flow_run_ids:
132
131
  continue
@@ -135,13 +134,12 @@ class ScheduledRunPoller:
135
134
  except anyio.WouldBlock:
136
135
  break # sorted: no earlier run fits
137
136
  self._submitting_flow_run_ids.add(flow_run.id)
138
- submitted_ids.add(flow_run.id)
139
137
  task_group.start_soon(self._submit_run, flow_run, task_group, slot_token)
140
138
 
141
139
  skipped_count = sum(
142
140
  1
143
141
  for r in submittable_flow_runs
144
- if r.id not in self._submitting_flow_run_ids and r.id not in submitted_ids
142
+ if r.id not in self._submitting_flow_run_ids
145
143
  )
146
144
  if skipped_count > 0:
147
145
  self._logger.info("%d scheduled runs skipped (at capacity)", skipped_count)
@@ -182,18 +180,15 @@ class ScheduledRunPoller:
182
180
  pull_interval = getattr(storage, "pull_interval", None)
183
181
  if storage and isinstance(pull_interval, (int, float)) and pull_interval:
184
182
  last_adhoc_pull = getattr(storage, "last_adhoc_pull", None)
185
- if (
186
- last_adhoc_pull is None
187
- or last_adhoc_pull
188
- < datetime.datetime.now()
189
- - datetime.timedelta(seconds=storage.pull_interval)
190
- ):
183
+ if last_adhoc_pull is None or last_adhoc_pull < now(
184
+ "UTC"
185
+ ) - datetime.timedelta(seconds=storage.pull_interval):
191
186
  self._logger.debug(
192
187
  "Performing adhoc pull of code for flow run %s",
193
188
  flow_run.id,
194
189
  )
195
190
  await storage.pull_code()
196
- storage.last_adhoc_pull = datetime.datetime.now()
191
+ storage.last_adhoc_pull = now("UTC")
197
192
 
198
193
  executor = FlowRunExecutor(
199
194
  flow_run=flow_run,
@@ -129,6 +129,7 @@ from prefect.settings import (
129
129
  from prefect.states import (
130
130
  AwaitingRetry,
131
131
  )
132
+ from prefect.types._datetime import now
132
133
  from prefect.types.entrypoint import EntrypointType
133
134
  from prefect.utilities.annotations import NotSet
134
135
  from prefect.utilities.asyncutils import (
@@ -214,7 +215,7 @@ class Runner:
214
215
  def goodbye_flow(name):
215
216
  print(f"goodbye {name}")
216
217
 
217
- if __name__ == "__main__"
218
+ if __name__ == "__main__":
218
219
  runner = Runner(name="my-runner")
219
220
 
220
221
  # Will be runnable via the API
@@ -613,17 +614,17 @@ class Runner:
613
614
  def goodbye_flow(name):
614
615
  print(f"goodbye {name}")
615
616
 
616
- if __name__ == "__main__"
617
- runner = Runner(name="my-runner")
617
+ if __name__ == "__main__":
618
+ runner = Runner(name="my-runner")
618
619
 
619
- # Will be runnable via the API
620
- runner.add_flow(hello_flow)
620
+ # Will be runnable via the API
621
+ runner.add_flow(hello_flow)
621
622
 
622
- # Run on a cron schedule
623
- runner.add_flow(goodbye_flow, schedule={"cron": "0 * * * *"})
623
+ # Run on a cron schedule
624
+ runner.add_flow(goodbye_flow, schedule={"cron": "0 * * * *"})
624
625
 
625
- asyncio.run(runner.start())
626
- ```
626
+ asyncio.run(runner.start())
627
+ ```
627
628
  """
628
629
  from prefect.runner.server import start_webserver
629
630
 
@@ -780,9 +781,9 @@ class Runner:
780
781
  # The process may be a multiprocessing.context.SpawnProcess, in which case it will have an `exitcode` attribute
781
782
  # but no `returncode` attribute
782
783
  if (
783
- getattr(process, "returncode", None)
784
- or getattr(process, "exitcode", None)
785
- ) is None:
784
+ getattr(process, "returncode", None) is None
785
+ and getattr(process, "exitcode", None) is None
786
+ ):
786
787
  await self._add_flow_run_process_map_entry(
787
788
  flow_run.id, ProcessMapEntry(pid=process.pid, flow_run=flow_run)
788
789
  )
@@ -1051,19 +1052,16 @@ class Runner:
1051
1052
  # adhoc pull hasn't been performed in the last pull_interval
1052
1053
  # TODO: Explore integrating this behavior with global concurrency.
1053
1054
  last_adhoc_pull = getattr(storage, "last_adhoc_pull", None)
1054
- if (
1055
- last_adhoc_pull is None
1056
- or last_adhoc_pull
1057
- < datetime.datetime.now()
1058
- - datetime.timedelta(seconds=storage.pull_interval)
1059
- ):
1055
+ if last_adhoc_pull is None or last_adhoc_pull < now(
1056
+ "UTC"
1057
+ ) - datetime.timedelta(seconds=storage.pull_interval):
1060
1058
  self._logger.debug(
1061
1059
  "Performing adhoc pull of code for flow run %s with storage %r",
1062
1060
  flow_run.id,
1063
1061
  storage,
1064
1062
  )
1065
1063
  await storage.pull_code()
1066
- setattr(storage, "last_adhoc_pull", datetime.datetime.now())
1064
+ setattr(storage, "last_adhoc_pull", now("UTC"))
1067
1065
 
1068
1066
  handed_off = False
1069
1067