prefect-client 3.6.27.dev4__tar.gz → 3.6.28__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 (422) hide show
  1. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/.gitignore +1 -0
  2. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/PKG-INFO +3 -3
  3. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/pyproject.toml +2 -2
  4. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/AGENTS.md +2 -0
  5. prefect_client-3.6.28/src/prefect/_build_info.py +5 -0
  6. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/__init__.py +100 -31
  7. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/execute.py +1 -0
  8. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/deprecated.py +7 -1
  9. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/v2_schema.py +14 -5
  10. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_result_records.py +16 -1
  11. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/notifications.py +19 -7
  12. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/webhook.py +16 -4
  13. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/AGENTS.md +1 -0
  14. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/_version_checking.py +1 -1
  15. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/objects.py +12 -0
  16. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/flow_engine.py +14 -1
  17. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/futures.py +51 -2
  18. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/AGENTS.md +5 -1
  19. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/serializers.py +38 -2
  20. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/sources.py +16 -16
  21. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/task_runners.py +11 -3
  22. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/_datetime.py +89 -39
  23. prefect_client-3.6.28/src/prefect/utilities/AGENTS.md +57 -0
  24. prefect_client-3.6.28/src/prefect/utilities/asyncutils/AGENTS.md +20 -0
  25. prefect_client-3.6.28/src/prefect/utilities/callables/AGENTS.md +22 -0
  26. prefect_client-3.6.27.dev4/src/prefect/utilities/callables.py → prefect_client-3.6.28/src/prefect/utilities/callables/__init__.py +2 -1
  27. prefect_client-3.6.28/src/prefect/utilities/engine/AGENTS.md +31 -0
  28. prefect_client-3.6.28/src/prefect/utilities/filesystem/AGENTS.md +17 -0
  29. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/importtools.py +11 -1
  30. prefect_client-3.6.28/src/prefect/utilities/processutils/AGENTS.md +22 -0
  31. prefect_client-3.6.28/src/prefect/utilities/schema_tools/AGENTS.md +53 -0
  32. prefect_client-3.6.28/src/prefect/utilities/templating/AGENTS.md +19 -0
  33. prefect_client-3.6.27.dev4/src/prefect/utilities/templating.py → prefect_client-3.6.28/src/prefect/utilities/templating/__init__.py +5 -0
  34. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/urls.py +230 -8
  35. prefect_client-3.6.27.dev4/src/prefect/_build_info.py +0 -5
  36. prefect_client-3.6.27.dev4/src/prefect/utilities/AGENTS.md +0 -81
  37. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/LICENSE +0 -0
  38. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/README.md +0 -0
  39. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/.prefectignore +0 -0
  40. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/__init__.py +0 -0
  41. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/__main__.py +0 -0
  42. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/__init__.py +0 -0
  43. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/_launchers.py +0 -0
  44. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
  45. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
  46. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
  47. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
  48. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
  49. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/__init__.py +0 -0
  50. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/apply.py +0 -0
  51. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  52. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/manager.py +0 -0
  53. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/spec.py +0 -0
  54. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/sla/__init__.py +0 -0
  55. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/sla/client.py +0 -0
  56. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/sla/objects.py +0 -0
  57. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/__init__.py +0 -0
  58. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/_logging.py +0 -0
  59. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/__init__.py +0 -0
  60. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  61. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/client.py +0 -0
  62. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/device_id.py +0 -0
  63. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/emit.py +0 -0
  64. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/enabled.py +0 -0
  65. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/events.py +0 -0
  66. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/milestones.py +0 -0
  67. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/notice.py +0 -0
  68. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/service.py +0 -0
  69. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/__init__.py +0 -0
  70. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  71. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/backports.py +0 -0
  72. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/blocks.py +0 -0
  73. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/migration.py +0 -0
  74. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/starlette.py +0 -0
  75. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/__init__.py +0 -0
  76. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/api.py +0 -0
  77. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/calls.py +0 -0
  78. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  79. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  80. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/inspection.py +0 -0
  81. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/primitives.py +0 -0
  82. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/services.py +0 -0
  83. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/threads.py +0 -0
  84. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/waiters.py +0 -0
  85. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/control_listener.py +0 -0
  86. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/installation.py +0 -0
  87. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/integrations.py +0 -0
  88. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/lazy.py +0 -0
  89. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/observability.py +0 -0
  90. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/__init__.py +0 -0
  91. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/schemas.py +0 -0
  92. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  93. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  94. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pytz.py +0 -0
  95. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/retries.py +0 -0
  96. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/__init__.py +0 -0
  97. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/bases.py +0 -0
  98. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/fields.py +0 -0
  99. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/serializers.py +0 -0
  100. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/validators.py +0 -0
  101. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  102. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/testing.py +0 -0
  103. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/urls.py +0 -0
  104. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/uuid7.py +0 -0
  105. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/websockets.py +0 -0
  106. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_observers.py +0 -0
  107. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/__init__.py +0 -0
  108. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/fetcher.py +0 -0
  109. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/generator.py +0 -0
  110. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/models.py +0 -0
  111. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/naming.py +0 -0
  112. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/renderer.py +0 -0
  113. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/schema_converter.py +0 -0
  114. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/templates/__init__.py +0 -0
  115. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  116. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/types.py +0 -0
  117. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/unions.py +0 -0
  118. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_states.py +0 -0
  119. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_vendor/croniter/__init__.py +0 -0
  120. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_vendor/croniter/croniter.py +0 -0
  121. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_versioning.py +0 -0
  122. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_waiters.py +0 -0
  123. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/agent.py +0 -0
  124. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/analytics/__init__.py +0 -0
  125. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/artifacts.py +0 -0
  126. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/assets/__init__.py +0 -0
  127. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/assets/core.py +0 -0
  128. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/assets/materialize.py +0 -0
  129. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/automations.py +0 -0
  130. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/AGENTS.md +0 -0
  131. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/__init__.py +0 -0
  132. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/abstract.py +0 -0
  133. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/core.py +0 -0
  134. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/fields.py +0 -0
  135. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/redis.py +0 -0
  136. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/system.py +0 -0
  137. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/cache_policies.py +0 -0
  138. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/__init__.py +0 -0
  139. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/attribution.py +0 -0
  140. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/base.py +0 -0
  141. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/cloud.py +0 -0
  142. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/collections.py +0 -0
  143. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/constants.py +0 -0
  144. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/__init__.py +0 -0
  145. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  146. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  147. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  148. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_automations/client.py +0 -0
  149. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  150. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  151. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  152. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  153. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  154. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  155. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  156. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  157. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  158. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  159. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  160. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_events/client.py +0 -0
  161. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  162. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  163. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  164. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_flows/client.py +0 -0
  165. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  166. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_logs/client.py +0 -0
  167. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  168. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_variables/client.py +0 -0
  169. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  170. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  171. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/base.py +0 -0
  172. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/routes.py +0 -0
  173. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/__init__.py +0 -0
  174. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/actions.py +0 -0
  175. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/events.py +0 -0
  176. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/filters.py +0 -0
  177. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/responses.py +0 -0
  178. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/schedules.py +0 -0
  179. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/sorting.py +0 -0
  180. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/subscriptions.py +0 -0
  181. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/types/__init__.py +0 -0
  182. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  183. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/utilities.py +0 -0
  184. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/AGENTS.md +0 -0
  185. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/__init__.py +0 -0
  186. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/_asyncio.py +0 -0
  187. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/_events.py +0 -0
  188. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/_leases.py +0 -0
  189. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/_sync.py +0 -0
  190. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/asyncio.py +0 -0
  191. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/context.py +0 -0
  192. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/services.py +0 -0
  193. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/sync.py +0 -0
  194. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/__init__.py +0 -0
  195. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  196. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/_events.py +0 -0
  197. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/asyncio.py +0 -0
  198. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/context.py +0 -0
  199. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/services.py +0 -0
  200. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/sync.py +0 -0
  201. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/context.py +0 -0
  202. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/AGENTS.md +0 -0
  203. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/__init__.py +0 -0
  204. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/base.py +0 -0
  205. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/deployments.py +0 -0
  206. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/flow_runs.py +0 -0
  207. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/runner.py +0 -0
  208. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/schedules.py +0 -0
  209. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/steps/__init__.py +0 -0
  210. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/steps/core.py +0 -0
  211. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/steps/pull.py +0 -0
  212. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/steps/utility.py +0 -0
  213. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/docker/__init__.py +0 -0
  214. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/docker/_buildx.py +0 -0
  215. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/docker/docker_image.py +0 -0
  216. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/engine.py +0 -0
  217. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/AGENTS.md +0 -0
  218. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/__init__.py +0 -0
  219. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/actions.py +0 -0
  220. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/clients.py +0 -0
  221. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/filters.py +0 -0
  222. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/related.py +0 -0
  223. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/__init__.py +0 -0
  224. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/automations.py +0 -0
  225. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  226. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/events.py +0 -0
  227. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/labelling.py +0 -0
  228. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/subscribers.py +0 -0
  229. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/utilities.py +0 -0
  230. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/worker.py +0 -0
  231. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/exceptions.py +0 -0
  232. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/filesystems.py +0 -0
  233. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/flow_runs.py +0 -0
  234. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/flows.py +0 -0
  235. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/__init__.py +0 -0
  236. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/base.py +0 -0
  237. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  238. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  239. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  240. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  241. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  242. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  243. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/input/__init__.py +0 -0
  244. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/input/actions.py +0 -0
  245. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/input/run_input.py +0 -0
  246. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/locking/__init__.py +0 -0
  247. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/locking/filesystem.py +0 -0
  248. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/locking/memory.py +0 -0
  249. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/locking/protocol.py +0 -0
  250. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/AGENTS.md +0 -0
  251. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/__init__.py +0 -0
  252. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/clients.py +0 -0
  253. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/configuration.py +0 -0
  254. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/filters.py +0 -0
  255. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/formatters.py +0 -0
  256. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/handlers.py +0 -0
  257. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/highlighters.py +0 -0
  258. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/loggers.py +0 -0
  259. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/logging.yml +0 -0
  260. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/main.py +0 -0
  261. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/plugins.py +0 -0
  262. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/py.typed +0 -0
  263. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/results.py +0 -0
  264. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/__init__.py +0 -0
  265. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_cancel_finalizer.py +0 -0
  266. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_cancellation_manager.py +0 -0
  267. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_control_channel.py +0 -0
  268. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_deployment_registry.py +0 -0
  269. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_event_emitter.py +0 -0
  270. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_flow_resolver.py +0 -0
  271. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_flow_run_executor.py +0 -0
  272. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_hook_runner.py +0 -0
  273. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_limit_manager.py +0 -0
  274. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_process_manager.py +0 -0
  275. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  276. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_starter_bundle.py +0 -0
  277. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_starter_direct.py +0 -0
  278. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_starter_engine.py +0 -0
  279. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_state_proposer.py +0 -0
  280. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/runner.py +0 -0
  281. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/server.py +0 -0
  282. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/storage.py +0 -0
  283. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runtime/__init__.py +0 -0
  284. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runtime/deployment.py +0 -0
  285. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runtime/flow_run.py +0 -0
  286. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runtime/task_run.py +0 -0
  287. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/schedules.py +0 -0
  288. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/__init__.py +0 -0
  289. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/admin.py +0 -0
  290. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/artifacts.py +0 -0
  291. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/automations.py +0 -0
  292. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/background_workers.py +0 -0
  293. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/block_capabilities.py +0 -0
  294. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/block_documents.py +0 -0
  295. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/block_schemas.py +0 -0
  296. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/block_types.py +0 -0
  297. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/clients.py +0 -0
  298. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/collections.py +0 -0
  299. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  300. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/concurrency_limits.py +0 -0
  301. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  302. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/csrf_token.py +0 -0
  303. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/dependencies.py +0 -0
  304. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/deployments.py +0 -0
  305. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/events.py +0 -0
  306. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/flow_run_states.py +0 -0
  307. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/flow_runs.py +0 -0
  308. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/flows.py +0 -0
  309. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/logs.py +0 -0
  310. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/middleware.py +0 -0
  311. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/root.py +0 -0
  312. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/run_history.py +0 -0
  313. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/saved_searches.py +0 -0
  314. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/server.py +0 -0
  315. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  316. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/task_run_states.py +0 -0
  317. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/task_runs.py +0 -0
  318. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/task_workers.py +0 -0
  319. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/templates.py +0 -0
  320. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/__init__.py +0 -0
  321. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/flow_runs.py +0 -0
  322. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/flows.py +0 -0
  323. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/schemas.py +0 -0
  324. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/task_runs.py +0 -0
  325. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/validation.py +0 -0
  326. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/variables.py +0 -0
  327. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/work_queues.py +0 -0
  328. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/workers.py +0 -0
  329. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/AGENTS.md +0 -0
  330. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/__init__.py +0 -0
  331. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/base.py +0 -0
  332. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/constants.py +0 -0
  333. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/context.py +0 -0
  334. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/legacy.py +0 -0
  335. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/__init__.py +0 -0
  336. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/_defaults.py +0 -0
  337. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/api.py +0 -0
  338. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/cli.py +0 -0
  339. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/client.py +0 -0
  340. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/cloud.py +0 -0
  341. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/deployments.py +0 -0
  342. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/events.py +0 -0
  343. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/experiments.py +0 -0
  344. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/flows.py +0 -0
  345. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/internal.py +0 -0
  346. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/logging.py +0 -0
  347. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/results.py +0 -0
  348. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/root.py +0 -0
  349. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/runner.py +0 -0
  350. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/__init__.py +0 -0
  351. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/api.py +0 -0
  352. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/concurrency.py +0 -0
  353. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/database.py +0 -0
  354. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/deployments.py +0 -0
  355. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/docket.py +0 -0
  356. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/ephemeral.py +0 -0
  357. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/events.py +0 -0
  358. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  359. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/logs.py +0 -0
  360. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/root.py +0 -0
  361. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/services.py +0 -0
  362. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/tasks.py +0 -0
  363. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/ui.py +0 -0
  364. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/tasks.py +0 -0
  365. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/telemetry.py +0 -0
  366. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/testing.py +0 -0
  367. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/worker.py +0 -0
  368. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/profiles.py +0 -0
  369. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/profiles.toml +0 -0
  370. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/states.py +0 -0
  371. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/task_engine.py +0 -0
  372. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/task_runs.py +0 -0
  373. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/task_worker.py +0 -0
  374. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/tasks.py +0 -0
  375. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/telemetry/__init__.py +0 -0
  376. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/telemetry/_metrics.py +0 -0
  377. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/telemetry/run_telemetry.py +0 -0
  378. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/transactions.py +0 -0
  379. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/__init__.py +0 -0
  380. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/_concurrency.py +0 -0
  381. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/_schema.py +0 -0
  382. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/entrypoint.py +0 -0
  383. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/names.py +0 -0
  384. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/__init__.py +0 -0
  385. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_ast.py +0 -0
  386. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_deprecated.py +0 -0
  387. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_engine.py +0 -0
  388. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_git.py +0 -0
  389. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
  390. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/annotations.py +0 -0
  391. /prefect_client-3.6.27.dev4/src/prefect/utilities/asyncutils.py → /prefect_client-3.6.28/src/prefect/utilities/asyncutils/__init__.py +0 -0
  392. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/collections.py +0 -0
  393. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/compat.py +0 -0
  394. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/context.py +0 -0
  395. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/dispatch.py +0 -0
  396. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/dockerutils.py +0 -0
  397. /prefect_client-3.6.27.dev4/src/prefect/utilities/engine.py → /prefect_client-3.6.28/src/prefect/utilities/engine/__init__.py +0 -0
  398. /prefect_client-3.6.27.dev4/src/prefect/utilities/filesystem.py → /prefect_client-3.6.28/src/prefect/utilities/filesystem/__init__.py +0 -0
  399. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/generics.py +0 -0
  400. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/hashing.py +0 -0
  401. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/math.py +0 -0
  402. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/names.py +0 -0
  403. /prefect_client-3.6.27.dev4/src/prefect/utilities/processutils.py → /prefect_client-3.6.28/src/prefect/utilities/processutils/__init__.py +0 -0
  404. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/pydantic.py +0 -0
  405. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/render_swagger.py +0 -0
  406. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  407. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  408. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/schema_tools/validation.py +0 -0
  409. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/services.py +0 -0
  410. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/slugify.py +0 -0
  411. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/text.py +0 -0
  412. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/timeout.py +0 -0
  413. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/visualization.py +0 -0
  414. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/variables.py +0 -0
  415. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/AGENTS.md +0 -0
  416. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/__init__.py +0 -0
  417. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/base.py +0 -0
  418. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/block.py +0 -0
  419. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/cloud.py +0 -0
  420. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/process.py +0 -0
  421. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/server.py +0 -0
  422. {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/utilities.py +0 -0
@@ -97,3 +97,4 @@ CLAUDE.md
97
97
 
98
98
  # Local planning artifacts
99
99
  .planning/
100
+ repros/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect-client
3
- Version: 3.6.27.dev4
3
+ Version: 3.6.28
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
@@ -40,7 +40,7 @@ Requires-Dist: jsonpatch<2.0,>=1.32
40
40
  Requires-Dist: jsonschema<5.0.0,>=4.18.0
41
41
  Requires-Dist: opentelemetry-api<2.0.0,>=1.27.0
42
42
  Requires-Dist: orjson<4.0,>=3.7
43
- Requires-Dist: packaging<26.1,>=21.3
43
+ Requires-Dist: packaging<26.2,>=21.3
44
44
  Requires-Dist: pathspec>=0.8.0
45
45
  Requires-Dist: pendulum<4,>=3.1.0; python_version < '3.13'
46
46
  Requires-Dist: prometheus-client>=0.20.0
@@ -53,7 +53,7 @@ Requires-Dist: python-slugify<9.0,>=5.0
53
53
  Requires-Dist: pytz<2027,>=2021.1
54
54
  Requires-Dist: pyyaml<7.0.0,>=5.4.1
55
55
  Requires-Dist: rfc3339-validator<0.2.0,>=0.1.4
56
- Requires-Dist: rich<15.0,>=11.0
56
+ Requires-Dist: rich<16.0,>=11.0
57
57
  Requires-Dist: ruamel-yaml-clib>=0.2.8; platform_python_implementation == 'CPython'
58
58
  Requires-Dist: ruamel-yaml>=0.17.0
59
59
  Requires-Dist: sniffio<2.0.0,>=1.3.0
@@ -44,7 +44,7 @@ dependencies = [
44
44
  "jsonschema>=4.18.0,<5.0.0",
45
45
  "opentelemetry-api>=1.27.0,<2.0.0",
46
46
  "orjson>=3.7,<4.0",
47
- "packaging>=21.3,<26.1",
47
+ "packaging>=21.3,<26.2",
48
48
  "pathspec>=0.8.0",
49
49
  "pendulum>=3.1.0,<4; python_version<'3.13'",
50
50
  "prometheus-client>=0.20.0",
@@ -57,7 +57,7 @@ dependencies = [
57
57
  "pytz>=2021.1,<2027",
58
58
  "pyyaml>=5.4.1,<7.0.0",
59
59
  "rfc3339-validator>=0.1.4,<0.2.0",
60
- "rich>=11.0,<15.0",
60
+ "rich>=11.0,<16.0",
61
61
  "ruamel.yaml>=0.17.0",
62
62
  "ruamel.yaml.clib>=0.2.8; platform_python_implementation == 'CPython'",
63
63
  "sniffio>=1.3.0,<2.0.0",
@@ -21,10 +21,12 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
21
21
 
22
22
  - **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.
23
23
  - **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
+ - **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `_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 `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.
24
25
  - **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.
25
26
  - **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.
26
27
  - **`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.
27
28
  - **`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.
29
+ - **`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.
28
30
 
29
31
  ## Logging
30
32
 
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.6.28"
3
+ __build_date__ = "2026-04-24 17:09:10.406247+00:00"
4
+ __git_commit__ = "e4d25f0bafb3b7499c2acafdc06fc7c5f8c67c9d"
5
+ __dirty__ = False
@@ -23,7 +23,10 @@ from typing_extensions import Literal, NotRequired, TypeAlias
23
23
 
24
24
  import anyio
25
25
  import cloudpickle # pyright: ignore[reportMissingTypeStubs]
26
+ from packaging.requirements import InvalidRequirement, Requirement
27
+ from packaging.version import Version
26
28
 
29
+ import prefect
27
30
  from prefect._internal.control_listener import configure_from_env
28
31
  from prefect.client.schemas.objects import FlowRun
29
32
  from prefect.context import SettingsContext, get_settings_context, serialize_context
@@ -36,7 +39,10 @@ from prefect.settings.models.root import Settings
36
39
  from prefect.utilities.processutils import sanitize_subprocess_env
37
40
  from prefect.utilities.slugify import slugify
38
41
 
39
- from prefect._experimental._launchers import validate_bundle_step_launcher
42
+ from prefect._experimental._launchers import (
43
+ get_launcher_for_side,
44
+ validate_bundle_step_launcher,
45
+ )
40
46
 
41
47
  from .execute import execute_bundle_from_file
42
48
  from ._file_collector import FileCollector
@@ -411,38 +417,48 @@ def create_bundle_for_flow_run(
411
417
  """
412
418
  context = context or serialize_context()
413
419
 
414
- dependencies = (
415
- subprocess.check_output(
416
- [
417
- _get_uv_path(),
418
- "pip",
419
- "freeze",
420
- # Exclude editable installs because we won't be able to install them in the execution environment
421
- "--exclude-editable",
422
- ]
420
+ # Skip `uv pip freeze` when the execution side of the flow's launcher
421
+ # opts out of uv-based launchers. The `dependencies` field is only
422
+ # consumed by `execute_bundle_in_subprocess` (which uses `uv pip install`);
423
+ # custom execution launchers are responsible for their own environment.
424
+ # Upload-only launcher overrides still use `uv run` at execution time and
425
+ # therefore still need the dependency snapshot.
426
+ flow_launcher = getattr(flow, "launcher", None)
427
+ if get_launcher_for_side(flow_launcher, "execution") is None:
428
+ dependencies = (
429
+ subprocess.check_output(
430
+ [
431
+ _get_uv_path(),
432
+ "pip",
433
+ "freeze",
434
+ # Exclude editable installs because we won't be able to install them in the execution environment
435
+ "--exclude-editable",
436
+ ]
437
+ )
438
+ .decode()
439
+ .strip()
423
440
  )
424
- .decode()
425
- .strip()
426
- )
427
441
 
428
- # Remove dependencies installed from a local file path because we won't be able
429
- # to install them in the execution environment. The user will be responsible for
430
- # making sure they are available in the execution environment
431
- filtered_dependencies: list[str] = []
432
- file_dependencies: list[str] = []
433
- for line in dependencies.split("\n"):
434
- if "file://" in line:
435
- file_dependencies.append(line)
436
- else:
437
- filtered_dependencies.append(line)
438
- dependencies = "\n".join(filtered_dependencies)
439
- if file_dependencies:
440
- logger.warning(
441
- "The following dependencies were installed from a local file path and will not be "
442
- "automatically installed in the execution environment: %s. If these dependencies "
443
- "are not available in the execution environment, your flow run may fail.",
444
- "\n".join(file_dependencies),
445
- )
442
+ # Remove dependencies installed from a local file path because we won't be able
443
+ # to install them in the execution environment. The user will be responsible for
444
+ # making sure they are available in the execution environment
445
+ filtered_dependencies: list[str] = []
446
+ file_dependencies: list[str] = []
447
+ for line in dependencies.split("\n"):
448
+ if "file://" in line:
449
+ file_dependencies.append(line)
450
+ else:
451
+ filtered_dependencies.append(line)
452
+ dependencies = "\n".join(filtered_dependencies)
453
+ if file_dependencies:
454
+ logger.warning(
455
+ "The following dependencies were installed from a local file path and will not be "
456
+ "automatically installed in the execution environment: %s. If these dependencies "
457
+ "are not available in the execution environment, your flow run may fail.",
458
+ "\n".join(file_dependencies),
459
+ )
460
+ else:
461
+ dependencies = ""
446
462
 
447
463
  # Collect and package included files if specified
448
464
  files_key: str | None = None
@@ -603,6 +619,52 @@ def execute_bundle_in_subprocess(
603
619
  return process
604
620
 
605
621
 
622
+ def _pin_prefect_in_bundle_step_requires(requires: list[str]) -> list[str]:
623
+ """
624
+ Ensure the `uv run --with` requirements for an outer bundle-step process
625
+ include the exact current publishable Prefect version.
626
+
627
+ The outer bundle-step process imports Prefect before the bundle's frozen
628
+ dependencies are installed, so transitive constraints like
629
+ `prefect>=3.6.24` from integration packages can otherwise resolve an
630
+ older stable Prefect even when the bundle was built against a newer
631
+ version. Pinning `prefect=={prefect.__version__}` keeps the outer
632
+ process on the same version the bundle was built with.
633
+
634
+ - Rewrites any existing `prefect` (or `prefect[...]`) requirement to the
635
+ exact current version, preserving extras and markers.
636
+ - Appends `prefect=={prefect.__version__}` if no Prefect requirement is
637
+ present.
638
+ - Returns the requirements unchanged for local/unpublishable versions,
639
+ matching the behavior of `prefect._internal.installation`.
640
+ """
641
+ version = Version(prefect.__version__)
642
+ if version.local:
643
+ return requires
644
+
645
+ pinned_version = prefect.__version__
646
+ updated: list[str] = []
647
+ found_prefect = False
648
+ for requirement in requires:
649
+ try:
650
+ parsed = Requirement(requirement)
651
+ except InvalidRequirement:
652
+ updated.append(requirement)
653
+ continue
654
+ if parsed.name.lower() != "prefect":
655
+ updated.append(requirement)
656
+ continue
657
+ found_prefect = True
658
+ extras = f"[{','.join(sorted(parsed.extras))}]" if parsed.extras else ""
659
+ marker = f" ; {parsed.marker}" if parsed.marker else ""
660
+ updated.append(f"prefect{extras}=={pinned_version}{marker}")
661
+
662
+ if not found_prefect:
663
+ updated.append(f"prefect=={pinned_version}")
664
+
665
+ return updated
666
+
667
+
606
668
  def convert_step_to_command(
607
669
  step: dict[str, Any], key: str, quiet: bool = False
608
670
  ) -> list[str]:
@@ -642,6 +704,13 @@ def convert_step_to_command(
642
704
  if quiet:
643
705
  command.append("--quiet")
644
706
 
707
+ # Pin the outer bundle-step process to the current publishable Prefect
708
+ # version so integration `requires` like `prefect-aws>=0.5.5` cannot
709
+ # resolve an older stable Prefect via transitive `prefect>=...`
710
+ # constraints before the bundle's frozen dependencies are applied.
711
+ if requires:
712
+ requires = _pin_prefect_in_bundle_step_requires(requires)
713
+
645
714
  # Add the `--with` argument to handle dependencies for running the step
646
715
  if requires:
647
716
  command.extend(["--with", ",".join(requires)])
@@ -39,6 +39,7 @@ async def execute_bundle(bundle: dict) -> None:
39
39
  control_channel=ctx.control_channel,
40
40
  ),
41
41
  resolve_flow=resolve_flow,
42
+ propose_submitting=False,
42
43
  )
43
44
  await executor.submit()
44
45
 
@@ -91,8 +91,14 @@ def generate_deprecation_message(
91
91
  if sys.version_info >= (3, 13):
92
92
  from whenever import PlainDateTime
93
93
 
94
+ _pdt_from_dt = (
95
+ PlainDateTime
96
+ if hasattr(PlainDateTime, "to_stdlib")
97
+ else PlainDateTime.from_py_datetime
98
+ )
99
+ _dt = _pdt_from_dt(start_date).add(months=6)
94
100
  end_date = (
95
- PlainDateTime.from_py_datetime(start_date).add(months=6).py_datetime()
101
+ _dt.to_stdlib() if hasattr(_dt, "to_stdlib") else _dt.py_datetime()
96
102
  )
97
103
  else:
98
104
  import pendulum
@@ -5,6 +5,7 @@ import typing as t
5
5
  import pydantic
6
6
  from pydantic import BaseModel as V2BaseModel
7
7
  from pydantic import ConfigDict, PydanticUndefinedAnnotation, create_model
8
+ from pydantic.errors import PydanticUserError
8
9
  from pydantic.fields import FieldInfo
9
10
  from pydantic.type_adapter import TypeAdapter
10
11
 
@@ -115,11 +116,19 @@ def create_v2_schema(
115
116
  raise TypeError(exc.message)
116
117
 
117
118
  # root model references under #definitions
118
- schema = adapter.json_schema(
119
- by_alias=True,
120
- ref_template="#/definitions/{model}",
121
- schema_generator=GenerateEmptySchemaForUserClasses,
122
- )
119
+ try:
120
+ schema = adapter.json_schema(
121
+ by_alias=True,
122
+ ref_template="#/definitions/{model}",
123
+ schema_generator=GenerateEmptySchemaForUserClasses,
124
+ )
125
+ except PydanticUserError as exc:
126
+ # In Pydantic >=2.13, unresolved forward references defer the error
127
+ # until the schema is built. Surface these as TypeError, matching the
128
+ # behavior parameter_schema expects for invalid parameter types.
129
+ if exc.code == "class-not-fully-defined":
130
+ raise TypeError(str(exc))
131
+ raise
123
132
  # ensure backwards compatibility by copying $defs into definitions
124
133
  if "$defs" in schema:
125
134
  schema["definitions"] = schema["$defs"]
@@ -17,6 +17,7 @@ from pydantic import (
17
17
  BaseModel,
18
18
  Field,
19
19
  ValidationError,
20
+ field_validator,
20
21
  model_validator,
21
22
  )
22
23
 
@@ -24,8 +25,9 @@ import prefect
24
25
  from prefect.exceptions import (
25
26
  SerializationError,
26
27
  )
27
- from prefect.serializers import PickleSerializer, Serializer
28
+ from prefect.serializers import PickleSerializer, Serializer, UnknownSerializer
28
29
  from prefect.types import DateTime
30
+ from prefect.utilities.dispatch import lookup_type
29
31
 
30
32
  if TYPE_CHECKING:
31
33
  pass
@@ -49,6 +51,19 @@ class ResultRecordMetadata(BaseModel):
49
51
  prefect_version: str = Field(default=prefect.__version__)
50
52
  storage_block_id: Optional[uuid.UUID] = Field(default=None)
51
53
 
54
+ @field_validator("serializer", mode="before")
55
+ @classmethod
56
+ def _tolerate_unknown_serializer(
57
+ cls, value: Serializer | dict[str, Any] | Any
58
+ ) -> Serializer | dict[str, Any] | Any:
59
+ if isinstance(value, dict) and "type" in value:
60
+ try:
61
+ lookup_type(Serializer, dispatch_key=value["type"])
62
+ except KeyError:
63
+ return UnknownSerializer.model_construct(**value)
64
+ return Serializer(**value)
65
+ return value
66
+
52
67
  def dump_bytes(self) -> bytes:
53
68
  """
54
69
  Serialize the metadata to bytes.
@@ -13,7 +13,11 @@ from prefect.blocks.abstract import NotificationBlock, NotificationError
13
13
  from prefect.logging import LogEavesdropper
14
14
  from prefect.types import SecretDict
15
15
  from prefect.utilities.templating import apply_values, find_placeholders
16
- from prefect.utilities.urls import validate_restricted_url
16
+ from prefect.utilities.urls import (
17
+ SSRFProtectedAsyncHTTPTransport,
18
+ SSRFProtectedHTTPTransport,
19
+ validate_restricted_url,
20
+ )
17
21
 
18
22
  PREFECT_NOTIFY_TYPE_DEFAULT = "info" # Use a valid apprise type as default
19
23
 
@@ -987,13 +991,18 @@ class CustomWebhookNotificationBlock(NotificationBlock):
987
991
  import httpx
988
992
 
989
993
  request_args = self._build_request_args(body, subject)
994
+ client_kwargs: dict[str, Any] = {
995
+ "headers": {"user-agent": "Prefect Notifications"},
996
+ }
990
997
  if not self.allow_private_urls:
991
998
  validate_restricted_url(request_args["url"])
999
+ # Re-validate at connection time and pin the resolved IP to close
1000
+ # the DNS-rebinding TOCTOU window.
1001
+ client_kwargs["transport"] = SSRFProtectedAsyncHTTPTransport()
992
1002
  cookies = request_args.pop("cookies", dict())
1003
+ client_kwargs["cookies"] = cookies
993
1004
  # make request with httpx
994
- async with httpx.AsyncClient(
995
- headers={"user-agent": "Prefect Notifications"}, cookies=cookies
996
- ) as client:
1005
+ async with httpx.AsyncClient(**client_kwargs) as client:
997
1006
  resp = await client.request(**request_args)
998
1007
  resp.raise_for_status()
999
1008
 
@@ -1002,13 +1011,16 @@ class CustomWebhookNotificationBlock(NotificationBlock):
1002
1011
  import httpx
1003
1012
 
1004
1013
  request_args = self._build_request_args(body, subject)
1014
+ client_kwargs: dict[str, Any] = {
1015
+ "headers": {"user-agent": "Prefect Notifications"},
1016
+ }
1005
1017
  if not self.allow_private_urls:
1006
1018
  validate_restricted_url(request_args["url"])
1019
+ client_kwargs["transport"] = SSRFProtectedHTTPTransport()
1007
1020
  cookies = request_args.pop("cookies", dict())
1021
+ client_kwargs["cookies"] = cookies
1008
1022
  # make request with httpx
1009
- with httpx.Client(
1010
- headers={"user-agent": "Prefect Notifications"}, cookies=cookies
1011
- ) as client:
1023
+ with httpx.Client(**client_kwargs) as client:
1012
1024
  resp = client.request(**request_args)
1013
1025
  resp.raise_for_status()
1014
1026
 
@@ -8,12 +8,21 @@ from typing_extensions import Literal
8
8
 
9
9
  from prefect.blocks.core import Block
10
10
  from prefect.types import SecretDict
11
- from prefect.utilities.urls import validate_restricted_url
11
+ from prefect.utilities.urls import (
12
+ SSRFProtectedAsyncHTTPTransport,
13
+ validate_restricted_url,
14
+ )
12
15
 
13
16
  # Use a global HTTP transport to maintain a process-wide connection pool for
14
17
  # interservice requests
15
18
  _http_transport = AsyncHTTPTransport()
16
19
  _insecure_http_transport = AsyncHTTPTransport(verify=False)
20
+ # Separate pools for calls that must be protected from DNS-rebinding SSRF. The
21
+ # protected transport validates the resolved IP at connection time and connects
22
+ # to the pre-resolved address, closing the TOCTOU window exploited by DNS
23
+ # rebinding attacks.
24
+ _safe_http_transport = SSRFProtectedAsyncHTTPTransport()
25
+ _safe_insecure_http_transport = SSRFProtectedAsyncHTTPTransport(verify=False)
17
26
 
18
27
 
19
28
  class Webhook(Block):
@@ -53,10 +62,13 @@ class Webhook(Block):
53
62
  )
54
63
 
55
64
  def block_initialization(self) -> None:
56
- if self.verify:
57
- self._client = AsyncClient(transport=_http_transport)
65
+ if self.allow_private_urls:
66
+ transport = _http_transport if self.verify else _insecure_http_transport
58
67
  else:
59
- self._client = AsyncClient(transport=_insecure_http_transport)
68
+ transport = (
69
+ _safe_http_transport if self.verify else _safe_insecure_http_transport
70
+ )
71
+ self._client = AsyncClient(transport=transport)
60
72
 
61
73
  async def call(self, payload: dict[str, Any] | str | None = None) -> Response:
62
74
  """
@@ -9,6 +9,7 @@ HTTP client for communicating with Prefect server and Prefect Cloud.
9
9
  - **Methods should accept simple kwargs** (`str`, `int`, `UUID`, etc.) and return Pydantic models. Avoid accepting complex objects as parameters.
10
10
  - **Client schemas are separate from server schemas.** This module has its own `schemas/` to avoid tangling with `server/schemas/`. Keep the boundary clean.
11
11
  - **Do not import server-only modules** (`server/database`, `server/models`, etc.) from anything in this directory — it would break the `prefect-client` package build.
12
+ - **Task-run submission schemas must be eagerly rebuilt.** Schemas instantiated on the concurrent submission path (`Task.create_local_run()`) are rebuilt at import time via `model_rebuild()` at the bottom of `schemas/objects.py`. Pydantic defers schema construction to first use; under threadpool contention, multiple workers race to build the same schema simultaneously. If you add a new schema used in this hot path, add a corresponding `model_rebuild()` call there.
12
13
 
13
14
  ## Structure
14
15
 
@@ -142,7 +142,7 @@ async def check_server_version(
142
142
  if auth_string:
143
143
  token = base64.b64encode(auth_string.encode("utf-8")).decode("utf-8")
144
144
  headers["Authorization"] = f"Basic {token}"
145
- elif api_key:
145
+ elif api_key and "Authorization" not in headers:
146
146
  headers["Authorization"] = f"Bearer {api_key}"
147
147
  if headers:
148
148
  httpx_kwargs["headers"] = headers
@@ -942,6 +942,18 @@ class TaskRun(TimeSeriesBaseModel, ObjectBaseModel):
942
942
  return get_or_create_run_name(name)
943
943
 
944
944
 
945
+ # These models are instantiated while task runs are being created locally on the
946
+ # concurrent submission path. Rebuild them eagerly so threadpool workers do not
947
+ # trigger deferred first-use schema builds under contention.
948
+ RunInput.model_rebuild()
949
+ TaskRunPolicy.model_rebuild()
950
+ TaskRunResult.model_rebuild()
951
+ FlowRunResult.model_rebuild()
952
+ Parameter.model_rebuild()
953
+ Constant.model_rebuild()
954
+ TaskRun.model_rebuild()
955
+
956
+
945
957
  class Workspace(PrefectBaseModel):
946
958
  """
947
959
  A Prefect Cloud workspace.
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import contextvars
4
5
  import datetime
5
6
  import logging
6
7
  import multiprocessing
@@ -292,7 +293,19 @@ def _send_heartbeats(
292
293
  return
293
294
  time.sleep(1)
294
295
 
295
- thread = threading.Thread(target=heartbeat_loop, daemon=True)
296
+ # Copy the current context so the heartbeat thread sees the same
297
+ # `SettingsContext` (and therefore the same `PREFECT_API_URL`) as the
298
+ # calling thread. Without this, `threading.Thread` starts with an empty
299
+ # context and `SettingsContext.get()` falls back to the process-wide
300
+ # `GLOBAL_SETTINGS_CONTEXT`, which is initialized at import time and can
301
+ # have a stale `api.url=None`. That caused `EventsWorker.instance()` from
302
+ # the heartbeat path to spawn an ephemeral `SubprocessASGIServer` during
303
+ # flow teardown, racing with interpreter shutdown and aborting the
304
+ # process.
305
+ heartbeat_ctx = contextvars.copy_context()
306
+ thread = threading.Thread(
307
+ target=heartbeat_ctx.run, args=(heartbeat_loop,), daemon=True
308
+ )
296
309
  thread.start()
297
310
  engine.logger.debug("Started flow run heartbeat context")
298
311
 
@@ -194,6 +194,44 @@ class PrefectConcurrentFuture(PrefectWrappedFuture[R, concurrent.futures.Future[
194
194
  when the task run is submitted to a ThreadPoolExecutor.
195
195
  """
196
196
 
197
+ def __init__(
198
+ self,
199
+ task_run_id: uuid.UUID,
200
+ wrapped_future: concurrent.futures.Future[R],
201
+ ):
202
+ super().__init__(task_run_id, wrapped_future)
203
+ self._prefect_done_callbacks: list[Callable[[PrefectFuture[R]], None]] = []
204
+ self._prefect_done_callbacks_lock = threading.Lock()
205
+ self._prefect_done_event = threading.Event()
206
+
207
+ # Register Prefect's internal completion notifier before any user callbacks
208
+ # so wait()/as_completed() do not depend on callback chain ordering.
209
+ self._wrapped_future.add_done_callback(self._notify_prefect_done_callbacks)
210
+
211
+ def _add_prefect_done_callback(
212
+ self, fn: Callable[[PrefectFuture[R]], None]
213
+ ) -> None:
214
+ with self._prefect_done_callbacks_lock:
215
+ if self._prefect_done_event.is_set():
216
+ call_immediately = True
217
+ else:
218
+ self._prefect_done_callbacks.append(fn)
219
+ call_immediately = False
220
+
221
+ if call_immediately:
222
+ fn(self)
223
+
224
+ def _notify_prefect_done_callbacks(
225
+ self, future: concurrent.futures.Future[R]
226
+ ) -> None:
227
+ with self._prefect_done_callbacks_lock:
228
+ self._prefect_done_event.set()
229
+ callbacks = self._prefect_done_callbacks[:]
230
+ self._prefect_done_callbacks.clear()
231
+
232
+ for callback in callbacks:
233
+ callback(self)
234
+
197
235
  def wait(self, timeout: float | None = None) -> None:
198
236
  try:
199
237
  result = self._wrapped_future.result(timeout=timeout)
@@ -538,6 +576,17 @@ class PrefectFutureList(list[PrefectFuture[R]], Iterator[PrefectFuture[R]]):
538
576
  return results
539
577
 
540
578
 
579
+ def _register_prefect_done_callback(
580
+ future: PrefectFuture[R], callback: Callable[[PrefectFuture[R]], None]
581
+ ) -> None:
582
+ add_prefect_done_callback = getattr(future, "_add_prefect_done_callback", None)
583
+ if add_prefect_done_callback is not None:
584
+ add_prefect_done_callback(callback)
585
+ return
586
+
587
+ future.add_done_callback(callback)
588
+
589
+
541
590
  def as_completed(
542
591
  futures: list[PrefectFuture[R]], timeout: float | None = None
543
592
  ) -> Generator[PrefectFuture[R], None]:
@@ -560,7 +609,7 @@ def as_completed(
560
609
  finished_event.set()
561
610
 
562
611
  for future in pending:
563
- future.add_done_callback(add_to_done)
612
+ _register_prefect_done_callback(future, add_to_done)
564
613
 
565
614
  while pending:
566
615
  finished_event.wait()
@@ -651,7 +700,7 @@ def wait(
651
700
 
652
701
  # Add callbacks to all pending futures
653
702
  for future in not_done:
654
- future.add_done_callback(mark_done)
703
+ _register_prefect_done_callback(future, mark_done)
655
704
 
656
705
  # Wait for futures to complete within timeout
657
706
  while not_done:
@@ -96,7 +96,11 @@ Each execution mode has a ProcessStarter implementation. To add a new execution
96
96
 
97
97
  `ScheduledRunPoller` now calls `propose_pending` (Scheduled → Pending) before handing off to `FlowRunExecutor`. `FlowRunExecutor` then calls `propose_submitting` (Pending → Submitting sub-state) as step 1 of its lifecycle **when `propose_submitting=True` (the default)**. These are two separate transitions — do not collapse them. The split exists so automations listening for the Pending state fire correctly before the executor begins.
98
98
 
99
- **Exception: `prefect flow-run execute` CLI path sets `propose_submitting=False`** via `FlowRunExecutorContext.create_executor(propose_submitting=False)`. The CLI is invoked by a worker that has already advanced the flow run past the Pending state, so proposing Submitting again would be wrong. The cancelling precheck (step 1a) still runs unconditionally even when `propose_submitting=False`.
99
+ **Two callers set `propose_submitting=False`** via `FlowRunExecutorContext.create_executor(propose_submitting=False)` both have already advanced the flow run past the Pending state, so proposing Submitting again would be wrong:
100
+ - `prefect flow-run execute` CLI path (invoked by a worker)
101
+ - `execute_bundle()` in `prefect._experimental.bundles.execute` (invoked by bundle dispatch)
102
+
103
+ The cancelling precheck (step 1a) still runs unconditionally even when `propose_submitting=False`.
100
104
 
101
105
  ## ProcessWorker Migration (Known Gap)
102
106
 
@@ -132,9 +132,16 @@ class Serializer(BaseModel, Generic[D]):
132
132
  except KeyError as exc:
133
133
  raise ValidationError.from_exception_data(
134
134
  title=cls.__name__,
135
- line_errors=[{"type": str(exc), "input": kwargs["type"]}],
135
+ line_errors=[
136
+ {
137
+ "type": "value_error",
138
+ "loc": ("type",),
139
+ "input": kwargs["type"],
140
+ "ctx": {"error": exc},
141
+ }
142
+ ],
136
143
  input_type="python",
137
- )
144
+ ) from exc
138
145
 
139
146
  return super().__new__(subcls)
140
147
  else:
@@ -158,6 +165,35 @@ class Serializer(BaseModel, Generic[D]):
158
165
  return type_str if isinstance(type_str, str) else None
159
166
 
160
167
 
168
+ class UnknownSerializer(Serializer):
169
+ """
170
+ Opaque placeholder for serializers that are unavailable in the current process.
171
+
172
+ This allows persisted result metadata to be inspected without importing the custom
173
+ serializer implementation. Actual serialization work still fails when attempted.
174
+ """
175
+
176
+ type: str
177
+
178
+ model_config: ClassVar[ConfigDict] = ConfigDict(extra="allow")
179
+
180
+ @classmethod
181
+ def __dispatch_key__(cls) -> str:
182
+ return "__unknown__"
183
+
184
+ def dumps(self, obj: Any) -> bytes:
185
+ raise RuntimeError(
186
+ f"Serializer {self.type!r} is not available in this environment, so "
187
+ "serialization cannot be performed."
188
+ )
189
+
190
+ def loads(self, blob: bytes) -> Any:
191
+ raise RuntimeError(
192
+ f"Serializer {self.type!r} is not available in this environment, so "
193
+ "deserialization cannot be performed."
194
+ )
195
+
196
+
161
197
  class PickleSerializer(Serializer[D]):
162
198
  """
163
199
  Serializes objects using the pickle protocol.