prefect-client 3.7.3.dev6__tar.gz → 3.7.4__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 (451) hide show
  1. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/PKG-INFO +1 -1
  2. prefect_client-3.7.4/src/prefect/_build_info.py +5 -0
  3. prefect_client-3.7.4/src/prefect/_internal/urls.py +57 -0
  4. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_automations/client.py +38 -4
  5. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/base.py +27 -0
  6. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/filters.py +22 -0
  7. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_workspace_starter.py +76 -4
  8. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/runner.py +1 -1
  9. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/storage.py +51 -9
  10. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/workers.py +59 -3
  11. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/AGENTS.md +2 -0
  12. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/_types.py +3 -0
  13. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/services.py +31 -0
  14. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/worker_channel.py +4 -4
  15. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/pydantic.py +2 -1
  16. prefect_client-3.7.3.dev6/src/prefect/_build_info.py +0 -5
  17. prefect_client-3.7.3.dev6/src/prefect/_internal/urls.py +0 -29
  18. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/.gitignore +0 -0
  19. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/LICENSE +0 -0
  20. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/README.md +0 -0
  21. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/hatch_build.py +0 -0
  22. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/pyproject.toml +0 -0
  23. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/.prefectignore +0 -0
  24. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/AGENTS.md +0 -0
  25. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/__init__.py +0 -0
  26. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/__main__.py +0 -0
  27. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/__init__.py +0 -0
  28. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/_launchers.py +0 -0
  29. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/bundles/__init__.py +0 -0
  30. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/bundles/execute.py +0 -0
  31. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/__init__.py +0 -0
  32. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/apply.py +0 -0
  33. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  34. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/manager.py +0 -0
  35. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/spec.py +0 -0
  36. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/sla/__init__.py +0 -0
  37. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/sla/client.py +0 -0
  38. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_experimental/sla/objects.py +0 -0
  39. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_flow_run_suspension.py +0 -0
  40. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/__init__.py +0 -0
  41. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/_logging.py +0 -0
  42. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/__init__.py +0 -0
  43. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  44. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/client.py +0 -0
  45. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/device_id.py +0 -0
  46. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/emit.py +0 -0
  47. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/enabled.py +0 -0
  48. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/events.py +0 -0
  49. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/milestones.py +0 -0
  50. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/notice.py +0 -0
  51. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/analytics/service.py +0 -0
  52. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/ast_utils.py +0 -0
  53. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/buildx.py +0 -0
  54. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/__init__.py +0 -0
  55. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  56. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/backports.py +0 -0
  57. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/blocks.py +0 -0
  58. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  59. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  60. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/migration.py +0 -0
  61. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/starlette.py +0 -0
  62. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/__init__.py +0 -0
  63. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/api.py +0 -0
  64. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/calls.py +0 -0
  65. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  66. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  67. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/inspection.py +0 -0
  68. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/primitives.py +0 -0
  69. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/services.py +0 -0
  70. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/threads.py +0 -0
  71. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/waiters.py +0 -0
  72. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/control_listener.py +0 -0
  73. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/deprecated.py +0 -0
  74. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/engine.py +0 -0
  75. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/git.py +0 -0
  76. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  77. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/installation.py +0 -0
  78. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/integrations.py +0 -0
  79. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/launchers.py +0 -0
  80. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/lazy.py +0 -0
  81. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/metrics.py +0 -0
  82. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/observability.py +0 -0
  83. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/observers.py +0 -0
  84. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/plugins/__init__.py +0 -0
  85. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/plugins/apply.py +0 -0
  86. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/plugins/collections.py +0 -0
  87. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  88. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/plugins/manager.py +0 -0
  89. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/plugins/spec.py +0 -0
  90. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/plugins/startup.py +0 -0
  91. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/__init__.py +0 -0
  92. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/schemas.py +0 -0
  93. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  94. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  95. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  96. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/pytz.py +0 -0
  97. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/result_records.py +0 -0
  98. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/retries.py +0 -0
  99. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/schema.py +0 -0
  100. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/schemas/__init__.py +0 -0
  101. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/schemas/bases.py +0 -0
  102. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/schemas/fields.py +0 -0
  103. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/schemas/serializers.py +0 -0
  104. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/schemas/validators.py +0 -0
  105. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  106. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/states.py +0 -0
  107. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/testing.py +0 -0
  108. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/uuid7.py +0 -0
  109. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/version_checking.py +0 -0
  110. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/versioning.py +0 -0
  111. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/waiters.py +0 -0
  112. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_internal/websockets.py +0 -0
  113. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/__init__.py +0 -0
  114. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/fetcher.py +0 -0
  115. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/generator.py +0 -0
  116. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/models.py +0 -0
  117. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/naming.py +0 -0
  118. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/renderer.py +0 -0
  119. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/schema_converter.py +0 -0
  120. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/templates/__init__.py +0 -0
  121. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  122. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/types.py +0 -0
  123. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_sdk/unions.py +0 -0
  124. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_vendor/croniter/__init__.py +0 -0
  125. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/_vendor/croniter/croniter.py +0 -0
  126. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/agent.py +0 -0
  127. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/analytics/__init__.py +0 -0
  128. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/artifacts.py +0 -0
  129. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/assets/__init__.py +0 -0
  130. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/assets/core.py +0 -0
  131. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/assets/materialize.py +0 -0
  132. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/automations.py +0 -0
  133. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/AGENTS.md +0 -0
  134. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/__init__.py +0 -0
  135. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/abstract.py +0 -0
  136. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/core.py +0 -0
  137. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/fields.py +0 -0
  138. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/notifications.py +0 -0
  139. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/redis.py +0 -0
  140. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/system.py +0 -0
  141. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/blocks/webhook.py +0 -0
  142. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/bundles/__init__.py +0 -0
  143. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/bundles/_file_collector.py +0 -0
  144. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/bundles/_ignore_filter.py +0 -0
  145. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/bundles/_path_resolver.py +0 -0
  146. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/bundles/_zip_builder.py +0 -0
  147. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/bundles/_zip_extractor.py +0 -0
  148. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/bundles/execute.py +0 -0
  149. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/cache_policies.py +0 -0
  150. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/AGENTS.md +0 -0
  151. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/__init__.py +0 -0
  152. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/attribution.py +0 -0
  153. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/base.py +0 -0
  154. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/cloud.py +0 -0
  155. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/collections.py +0 -0
  156. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/constants.py +0 -0
  157. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/__init__.py +0 -0
  158. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  159. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  160. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  161. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  162. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  163. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  164. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  165. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  166. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  167. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  168. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  169. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  170. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  171. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  172. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_events/client.py +0 -0
  173. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  174. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  175. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  176. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_flows/client.py +0 -0
  177. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  178. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_logs/client.py +0 -0
  179. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  180. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_variables/client.py +0 -0
  181. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  182. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  183. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/base.py +0 -0
  184. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/orchestration/routes.py +0 -0
  185. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/__init__.py +0 -0
  186. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/actions.py +0 -0
  187. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/events.py +0 -0
  188. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/filters.py +0 -0
  189. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/objects.py +0 -0
  190. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/responses.py +0 -0
  191. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/schedules.py +0 -0
  192. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/sorting.py +0 -0
  193. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/schemas/worker_channel.py +0 -0
  194. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/subscriptions.py +0 -0
  195. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/types/__init__.py +0 -0
  196. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  197. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/client/utilities.py +0 -0
  198. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/AGENTS.md +0 -0
  199. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/__init__.py +0 -0
  200. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/_asyncio.py +0 -0
  201. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/_events.py +0 -0
  202. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/_leases.py +0 -0
  203. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/_sync.py +0 -0
  204. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/asyncio.py +0 -0
  205. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/context.py +0 -0
  206. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/services.py +0 -0
  207. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/sync.py +0 -0
  208. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/v1/__init__.py +0 -0
  209. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  210. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/v1/_events.py +0 -0
  211. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/v1/asyncio.py +0 -0
  212. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/v1/context.py +0 -0
  213. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/v1/services.py +0 -0
  214. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/concurrency/v1/sync.py +0 -0
  215. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/context.py +0 -0
  216. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/AGENTS.md +0 -0
  217. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/__init__.py +0 -0
  218. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/deployments.py +0 -0
  219. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/flow_runs.py +0 -0
  220. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/runner.py +0 -0
  221. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/schedules.py +0 -0
  222. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/steps/__init__.py +0 -0
  223. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/steps/core.py +0 -0
  224. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/steps/pull.py +0 -0
  225. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/deployments/steps/utility.py +0 -0
  226. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/docker/__init__.py +0 -0
  227. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/docker/_buildx.py +0 -0
  228. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/docker/docker_image.py +0 -0
  229. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/engine.py +0 -0
  230. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/AGENTS.md +0 -0
  231. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/__init__.py +0 -0
  232. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/actions.py +0 -0
  233. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/clients.py +0 -0
  234. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/related.py +0 -0
  235. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/schemas/__init__.py +0 -0
  236. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/schemas/automations.py +0 -0
  237. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  238. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/schemas/events.py +0 -0
  239. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/schemas/labelling.py +0 -0
  240. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/subscribers.py +0 -0
  241. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/utilities.py +0 -0
  242. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/events/worker.py +0 -0
  243. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/exceptions.py +0 -0
  244. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/filesystems.py +0 -0
  245. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/flow_engine.py +0 -0
  246. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/flow_runs.py +0 -0
  247. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/flows.py +0 -0
  248. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/futures.py +0 -0
  249. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/infrastructure/__init__.py +0 -0
  250. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/infrastructure/base.py +0 -0
  251. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  252. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  253. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  254. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  255. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  256. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  257. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/input/__init__.py +0 -0
  258. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/input/actions.py +0 -0
  259. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/input/run_input.py +0 -0
  260. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/locking/__init__.py +0 -0
  261. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/locking/_filelock.py +0 -0
  262. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/locking/filesystem.py +0 -0
  263. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/locking/memory.py +0 -0
  264. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/locking/protocol.py +0 -0
  265. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/AGENTS.md +0 -0
  266. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/__init__.py +0 -0
  267. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/clients.py +0 -0
  268. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/configuration.py +0 -0
  269. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/filters.py +0 -0
  270. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/formatters.py +0 -0
  271. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/handlers.py +0 -0
  272. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/highlighters.py +0 -0
  273. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/loggers.py +0 -0
  274. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/logging/logging.yml +0 -0
  275. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/main.py +0 -0
  276. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/plugins.py +0 -0
  277. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/py.typed +0 -0
  278. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/results.py +0 -0
  279. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/AGENTS.md +0 -0
  280. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/__init__.py +0 -0
  281. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_cancel_finalizer.py +0 -0
  282. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_cancellation_manager.py +0 -0
  283. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_control_channel.py +0 -0
  284. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_deployment_registry.py +0 -0
  285. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_event_emitter.py +0 -0
  286. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_flow_resolver.py +0 -0
  287. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_flow_run_executor.py +0 -0
  288. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_hook_runner.py +0 -0
  289. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_limit_manager.py +0 -0
  290. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_process_manager.py +0 -0
  291. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  292. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_starter_bundle.py +0 -0
  293. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_starter_direct.py +0 -0
  294. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_starter_engine.py +0 -0
  295. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_state_proposer.py +0 -0
  296. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/_workspace_resolver.py +0 -0
  297. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runner/server.py +0 -0
  298. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runtime/__init__.py +0 -0
  299. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runtime/deployment.py +0 -0
  300. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runtime/flow_run.py +0 -0
  301. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/runtime/task_run.py +0 -0
  302. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/schedules.py +0 -0
  303. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/serializers.py +0 -0
  304. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/__init__.py +0 -0
  305. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/_ui_static.py +0 -0
  306. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/admin.py +0 -0
  307. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/artifacts.py +0 -0
  308. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/automations.py +0 -0
  309. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/background_workers.py +0 -0
  310. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/block_capabilities.py +0 -0
  311. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/block_documents.py +0 -0
  312. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/block_schemas.py +0 -0
  313. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/block_types.py +0 -0
  314. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/clients.py +0 -0
  315. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/collections.py +0 -0
  316. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  317. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/concurrency_limits.py +0 -0
  318. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  319. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/csrf_token.py +0 -0
  320. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/dependencies.py +0 -0
  321. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/deployments.py +0 -0
  322. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/events.py +0 -0
  323. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/flow_run_states.py +0 -0
  324. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/flow_runs.py +0 -0
  325. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/flows.py +0 -0
  326. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/logs.py +0 -0
  327. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/middleware.py +0 -0
  328. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/root.py +0 -0
  329. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/run_history.py +0 -0
  330. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/saved_searches.py +0 -0
  331. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/server.py +0 -0
  332. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  333. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/task_run_states.py +0 -0
  334. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/task_runs.py +0 -0
  335. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/task_workers.py +0 -0
  336. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/templates.py +0 -0
  337. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/ui/__init__.py +0 -0
  338. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/ui/flow_runs.py +0 -0
  339. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/ui/flows.py +0 -0
  340. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/ui/schemas.py +0 -0
  341. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/ui/task_runs.py +0 -0
  342. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/validation.py +0 -0
  343. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/variables.py +0 -0
  344. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/server/api/work_queues.py +0 -0
  345. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/__init__.py +0 -0
  346. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/base.py +0 -0
  347. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/constants.py +0 -0
  348. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/context.py +0 -0
  349. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/legacy.py +0 -0
  350. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/__init__.py +0 -0
  351. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/_defaults.py +0 -0
  352. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/api.py +0 -0
  353. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/cli.py +0 -0
  354. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/client.py +0 -0
  355. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/cloud.py +0 -0
  356. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/deployments.py +0 -0
  357. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/events.py +0 -0
  358. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/experiments.py +0 -0
  359. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/flows.py +0 -0
  360. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/internal.py +0 -0
  361. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/logging.py +0 -0
  362. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/plugins.py +0 -0
  363. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/results.py +0 -0
  364. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/root.py +0 -0
  365. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/runner.py +0 -0
  366. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/__init__.py +0 -0
  367. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/api.py +0 -0
  368. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/concurrency.py +0 -0
  369. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/database.py +0 -0
  370. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/deployments.py +0 -0
  371. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/docket.py +0 -0
  372. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/ephemeral.py +0 -0
  373. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/events.py +0 -0
  374. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  375. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/logs.py +0 -0
  376. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/root.py +0 -0
  377. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/tasks.py +0 -0
  378. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/server/ui.py +0 -0
  379. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/tasks.py +0 -0
  380. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/telemetry.py +0 -0
  381. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/testing.py +0 -0
  382. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/models/worker.py +0 -0
  383. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/profiles.py +0 -0
  384. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/profiles.toml +0 -0
  385. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/settings/sources.py +0 -0
  386. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/states.py +0 -0
  387. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/task_engine.py +0 -0
  388. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/task_runners.py +0 -0
  389. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/task_runs.py +0 -0
  390. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/task_worker.py +0 -0
  391. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/tasks.py +0 -0
  392. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/telemetry/__init__.py +0 -0
  393. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/telemetry/run_telemetry.py +0 -0
  394. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/transactions.py +0 -0
  395. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/types/__init__.py +0 -0
  396. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/types/_concurrency.py +0 -0
  397. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/types/_datetime.py +0 -0
  398. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/types/entrypoint.py +0 -0
  399. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/types/names.py +0 -0
  400. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/AGENTS.md +0 -0
  401. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/__init__.py +0 -0
  402. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/annotations.py +0 -0
  403. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  404. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  405. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/callables/AGENTS.md +0 -0
  406. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/callables/__init__.py +0 -0
  407. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/collections.py +0 -0
  408. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/compat.py +0 -0
  409. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/context.py +0 -0
  410. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/dispatch.py +0 -0
  411. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/dockerutils.py +0 -0
  412. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/engine/AGENTS.md +0 -0
  413. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/engine/__init__.py +0 -0
  414. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  415. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/filesystem/__init__.py +0 -0
  416. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/generics.py +0 -0
  417. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/hashing.py +0 -0
  418. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/importtools.py +0 -0
  419. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/math.py +0 -0
  420. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/names.py +0 -0
  421. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  422. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/processutils/__init__.py +0 -0
  423. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/render_swagger.py +0 -0
  424. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  425. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  426. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  427. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/schema_tools/validation.py +0 -0
  428. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/services.py +0 -0
  429. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/slugify.py +0 -0
  430. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/templating/AGENTS.md +0 -0
  431. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/templating/__init__.py +0 -0
  432. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/text.py +0 -0
  433. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/timeout.py +0 -0
  434. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/urls.py +0 -0
  435. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/utilities/visualization.py +0 -0
  436. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/variables.py +0 -0
  437. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/AGENTS.md +0 -0
  438. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/__init__.py +0 -0
  439. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/_cleanup.py +0 -0
  440. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/_cleanup_handlers.py +0 -0
  441. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  442. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  443. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/_state.py +0 -0
  444. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  445. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  446. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/base.py +0 -0
  447. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/block.py +0 -0
  448. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/cloud.py +0 -0
  449. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/process.py +0 -0
  450. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/src/prefect/workers/server.py +0 -0
  451. {prefect_client-3.7.3.dev6 → prefect_client-3.7.4}/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.3.dev6
3
+ Version: 3.7.4
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.7.4"
3
+ __build_date__ = "2026-06-05 17:24:15.839084+00:00"
4
+ __git_commit__ = "d67b25c983b865769cbb8c4afc84387238a22cbc"
5
+ __dirty__ = False
@@ -0,0 +1,57 @@
1
+ import re
2
+ from collections.abc import Iterable
3
+ from urllib.parse import urlparse, urlunparse
4
+
5
+ _URL_AUTH_PATTERN = re.compile(
6
+ r"(?P<scheme>https?://)[^/\s'\"<>]*@", flags=re.IGNORECASE
7
+ )
8
+
9
+
10
+ def strip_auth_from_url(url: str) -> str:
11
+ """
12
+ Remove authentication credentials (username/password) from a URL.
13
+
14
+ Useful for sanitizing URLs before including them in error messages
15
+ or logs to avoid leaking secrets.
16
+ """
17
+ try:
18
+ parsed = urlparse(url)
19
+
20
+ if not parsed.hostname:
21
+ return url
22
+
23
+ netloc = parsed.hostname
24
+ if parsed.port:
25
+ netloc = f"{netloc}:{parsed.port}"
26
+
27
+ return urlunparse(
28
+ (
29
+ parsed.scheme,
30
+ netloc,
31
+ parsed.path,
32
+ parsed.params,
33
+ parsed.query,
34
+ parsed.fragment,
35
+ )
36
+ )
37
+ except ValueError:
38
+ return strip_auth_from_urls_in_text(url)
39
+
40
+
41
+ def strip_auth_from_urls_in_text(
42
+ text: str, extra_secrets: Iterable[str] | None = None
43
+ ) -> str:
44
+ """
45
+ Remove authentication credentials from HTTP(S) URLs embedded in text.
46
+
47
+ Useful for sanitizing command output before including it in error messages
48
+ or logs. Any caller-supplied secrets are replaced with a redaction marker.
49
+ """
50
+ if not text:
51
+ return text
52
+
53
+ sanitized = _URL_AUTH_PATTERN.sub(r"\g<scheme>", text)
54
+ for secret in extra_secrets or ():
55
+ if secret:
56
+ sanitized = sanitized.replace(secret, "***")
57
+ return sanitized
@@ -10,6 +10,8 @@ from prefect.exceptions import ObjectNotFound
10
10
  if TYPE_CHECKING:
11
11
  from uuid import UUID
12
12
 
13
+ from prefect.client.schemas.sorting import AutomationSort
14
+ from prefect.events.filters import AutomationFilter
13
15
  from prefect.events.schemas.automations import Automation, AutomationCore
14
16
 
15
17
 
@@ -37,8 +39,24 @@ class AutomationClient(BaseClient):
37
39
  )
38
40
  response.raise_for_status()
39
41
 
40
- def read_automations(self) -> list["Automation"]:
41
- response = self.request("POST", "/automations/filter")
42
+ def read_automations(
43
+ self,
44
+ *,
45
+ automations: "AutomationFilter | None" = None,
46
+ sort: "AutomationSort | None" = None,
47
+ limit: int | None = None,
48
+ offset: int = 0,
49
+ ) -> list["Automation"]:
50
+ body: dict[str, object] = {
51
+ "automations": (
52
+ automations.model_dump(mode="json") if automations else None
53
+ ),
54
+ "sort": sort,
55
+ "limit": limit,
56
+ "offset": offset,
57
+ }
58
+
59
+ response = self.request("POST", "/automations/filter", json=body)
42
60
  response.raise_for_status()
43
61
  from prefect.events.schemas.automations import Automation
44
62
 
@@ -196,8 +214,24 @@ class AutomationAsyncClient(BaseAsyncClient):
196
214
  )
197
215
  response.raise_for_status()
198
216
 
199
- async def read_automations(self) -> list["Automation"]:
200
- response = await self.request("POST", "/automations/filter")
217
+ async def read_automations(
218
+ self,
219
+ *,
220
+ automations: "AutomationFilter | None" = None,
221
+ sort: "AutomationSort | None" = None,
222
+ limit: int | None = None,
223
+ offset: int = 0,
224
+ ) -> list["Automation"]:
225
+ body: dict[str, object] = {
226
+ "automations": (
227
+ automations.model_dump(mode="json") if automations else None
228
+ ),
229
+ "sort": sort,
230
+ "limit": limit,
231
+ "offset": offset,
232
+ }
233
+
234
+ response = await self.request("POST", "/automations/filter", json=body)
201
235
  response.raise_for_status()
202
236
  from prefect.events.schemas.automations import Automation
203
237
 
@@ -278,6 +278,33 @@ def _interval_schedule_to_dict(schedule: IntervalSchedule) -> dict[str, Any]:
278
278
  return schedule_config
279
279
 
280
280
 
281
+ def _deployment_already_saved_to_prefect_file(
282
+ deployment: dict[str, Any],
283
+ prefect_file: Path = Path("prefect.yaml"),
284
+ ) -> bool:
285
+ """
286
+ Return True if `prefect.yaml` already contains a deployment entry matching the
287
+ given deployment's name and entrypoint.
288
+
289
+ Used to decide whether the interactive `prefect deploy` flow should offer to
290
+ persist a newly-created deployment: a deployment that is already declared in
291
+ the file does not need to be saved again, but a brand-new one (even when the
292
+ file otherwise exists) should still be offered up for saving.
293
+ """
294
+ if not prefect_file.exists():
295
+ return False
296
+
297
+ with prefect_file.open(mode="r") as f:
298
+ contents = yaml.safe_load(f) or {}
299
+
300
+ for existing in contents.get("deployments") or []:
301
+ if existing.get("name") == deployment.get("name") and existing.get(
302
+ "entrypoint"
303
+ ) == deployment.get("entrypoint"):
304
+ return True
305
+ return False
306
+
307
+
281
308
  def _save_deployment_to_prefect_file(
282
309
  deployment: dict[str, Any],
283
310
  build_steps: list[dict[str, Any]] | None = None,
@@ -32,6 +32,25 @@ class AutomationFilterName(PrefectBaseModel):
32
32
  )
33
33
 
34
34
 
35
+ class AutomationFilterTags(PrefectBaseModel):
36
+ """Filter by `Automation.tags`."""
37
+
38
+ all_: Optional[list[str]] = Field(
39
+ default=None,
40
+ examples=[["tag-1", "tag-2"]],
41
+ description="A list of tags. Automations will be returned only if their tags are a superset of the list",
42
+ )
43
+ any_: Optional[list[str]] = Field(
44
+ default=None,
45
+ examples=[["tag-1", "tag-2"]],
46
+ description="A list of tags. Automations will be returned if their tags contain any of the tags in the list",
47
+ )
48
+ is_null_: Optional[bool] = Field(
49
+ default=None,
50
+ description="If true, only include automations without tags",
51
+ )
52
+
53
+
35
54
  class AutomationFilter(PrefectBaseModel):
36
55
  name: Optional[AutomationFilterName] = Field(
37
56
  default=None, description="Filter criteria for `Automation.name`"
@@ -39,6 +58,9 @@ class AutomationFilter(PrefectBaseModel):
39
58
  created: Optional[AutomationFilterCreated] = Field(
40
59
  default=None, description="Filter criteria for `Automation.created`"
41
60
  )
61
+ tags: Optional[AutomationFilterTags] = Field(
62
+ default=None, description="Filter criteria for `Automation.tags`"
63
+ )
42
64
 
43
65
 
44
66
  class EventDataFilter(PrefectBaseModel, extra="forbid"): # type: ignore[call-arg]
@@ -1,9 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import functools
3
4
  import os
4
5
  import shutil
6
+ import site
5
7
  import subprocess
6
8
  import sys
9
+ import sysconfig
7
10
  from contextlib import contextmanager
8
11
  from pathlib import Path
9
12
  from typing import TYPE_CHECKING, Any, Iterable, Iterator
@@ -109,14 +112,83 @@ def _workspace_sys_path(workspace: PreparedWorkspace) -> list[str]:
109
112
  return entries
110
113
 
111
114
 
115
+ @functools.lru_cache(maxsize=1)
116
+ def _stdlib_prefixes() -> tuple[str, ...]:
117
+ """Resolved stdlib directory prefixes whose children should not land on PYTHONPATH."""
118
+ roots: set[str] = set()
119
+ paths = sysconfig.get_paths()
120
+ for key in ("stdlib", "platstdlib"):
121
+ val = paths.get(key)
122
+ if val:
123
+ roots.add(str(Path(val).resolve()))
124
+ return tuple(sorted(roots))
125
+
126
+
127
+ @functools.lru_cache(maxsize=1)
128
+ def _site_packages_dirs() -> tuple[str, ...]:
129
+ """Resolved site-packages directories that should always be kept."""
130
+ dirs: set[str] = set()
131
+ paths = sysconfig.get_paths()
132
+ for key in ("purelib", "platlib"):
133
+ val = paths.get(key)
134
+ if val:
135
+ dirs.add(str(Path(val).resolve()))
136
+ try:
137
+ for sp in site.getsitepackages():
138
+ dirs.add(str(Path(sp).resolve()))
139
+ except AttributeError:
140
+ pass
141
+ try:
142
+ usp = site.getusersitepackages()
143
+ if isinstance(usp, str):
144
+ dirs.add(str(Path(usp).resolve()))
145
+ except AttributeError:
146
+ pass
147
+ return tuple(sorted(dirs))
148
+
149
+
150
+ def _is_stdlib_path(entry: str) -> bool:
151
+ """True when *entry* is a stdlib, lib-dynload, or stdlib zip path.
152
+
153
+ Site-packages directories that live under the stdlib tree are kept.
154
+ Only interpreter stdlib zip archives next to stdlib directories are filtered;
155
+ user archives like `/app/python_deps.zip` are preserved.
156
+ """
157
+ if not entry:
158
+ return False
159
+
160
+ resolved_path = Path(entry).resolve()
161
+ resolved = str(resolved_path)
162
+
163
+ for sp in _site_packages_dirs():
164
+ if resolved == sp or resolved.startswith(sp + os.sep):
165
+ return False
166
+
167
+ for root in _stdlib_prefixes():
168
+ if resolved == root or resolved.startswith(root + os.sep):
169
+ return True
170
+
171
+ interpreter_zip_name = f"python{sys.version_info.major}{sys.version_info.minor}.zip"
172
+ if resolved_path.name == interpreter_zip_name:
173
+ resolved_parent = str(resolved_path.parent)
174
+ stdlib_parents = {str(Path(r).parent) for r in _stdlib_prefixes()}
175
+ if resolved_parent in stdlib_parents:
176
+ return True
177
+
178
+ return False
179
+
180
+
112
181
  def workspace_environment(workspace: PreparedWorkspace) -> dict[str, str]:
113
182
  environment = dict(workspace.environment)
114
- pythonpath_entries = _workspace_sys_path(workspace)
183
+ pythonpath_entries: list[str] = []
184
+ candidate_entries = _workspace_sys_path(workspace)
115
185
  existing_pythonpath = environment.get("PYTHONPATH")
116
186
  if existing_pythonpath:
117
- for entry in existing_pythonpath.split(os.pathsep):
118
- if entry and entry not in pythonpath_entries:
119
- pythonpath_entries.append(entry)
187
+ candidate_entries.extend(existing_pythonpath.split(os.pathsep))
188
+
189
+ for entry in candidate_entries:
190
+ if entry and entry not in pythonpath_entries and not _is_stdlib_path(entry):
191
+ pythonpath_entries.append(entry)
120
192
 
121
193
  environment["PYTHONPATH"] = os.pathsep.join(pythonpath_entries)
122
194
  return environment
@@ -1701,7 +1701,7 @@ class Runner:
1701
1701
  ):
1702
1702
  return self._deployment_registry.get_flow(flow_run.deployment_id)
1703
1703
  return await load_flow_from_flow_run(
1704
- self._client, flow_run, storage_base_path=str(self._tmp_dir)
1704
+ flow_run, storage_base_path=str(self._tmp_dir)
1705
1705
  )
1706
1706
 
1707
1707
  self._hook_runner = HookRunner(resolve_flow=_resolve_flow_for_hooks)
@@ -14,7 +14,7 @@ from typing import (
14
14
  Union,
15
15
  runtime_checkable,
16
16
  )
17
- from urllib.parse import quote, urlparse, urlsplit, urlunparse
17
+ from urllib.parse import quote, unquote, urlparse, urlsplit, urlunparse
18
18
  from uuid import uuid4
19
19
 
20
20
  import fsspec # pyright: ignore[reportMissingTypeStubs]
@@ -22,7 +22,7 @@ from anyio import run_process
22
22
  from pydantic import SecretStr
23
23
 
24
24
  from prefect._internal.concurrency.api import create_call, from_async
25
- from prefect._internal.urls import strip_auth_from_url
25
+ from prefect._internal.urls import strip_auth_from_url, strip_auth_from_urls_in_text
26
26
  from prefect.blocks.core import Block, BlockNotSavedError
27
27
  from prefect.blocks.system import Secret
28
28
  from prefect.filesystems import ReadableDeploymentStorage, WritableDeploymentStorage
@@ -499,6 +499,21 @@ class GitRepository:
499
499
  else exc
500
500
  )
501
501
  safe_url = strip_auth_from_url(self._url)
502
+ sanitized_stderr = strip_auth_from_urls_in_text(
503
+ _decode_stderr(exc),
504
+ extra_secrets=_url_auth_secrets(self._url, repository_url),
505
+ )
506
+ # Surface the raw git error at DEBUG so users can opt in via log
507
+ # level when the hint patterns don't match. The exception chain is
508
+ # suppressed above when credentials are present, so DEBUG is the
509
+ # only way to see the actual git output in that case.
510
+ if sanitized_stderr:
511
+ self._logger.debug(
512
+ "git clone failed (exit %d) for %r: %s",
513
+ exc.returncode,
514
+ safe_url,
515
+ sanitized_stderr.strip(),
516
+ )
502
517
  error_message = (
503
518
  f"Failed to clone repository {safe_url!r} with exit code"
504
519
  f" {exc.returncode}."
@@ -506,6 +521,14 @@ class GitRepository:
506
521
  hint = _get_git_clone_error_hint(exc)
507
522
  if hint:
508
523
  error_message += f" {hint}"
524
+ elif sanitized_stderr:
525
+ # No pattern matched -- surface the actual git error so the
526
+ # user doesn't have to enable DEBUG to know what went wrong.
527
+ snippet = sanitized_stderr.strip().splitlines()
528
+ # Keep the last few lines; git's final 'fatal:' line is usually
529
+ # the actionable one.
530
+ tail = " | ".join(snippet[-3:])
531
+ error_message += f" git stderr: {tail}"
509
532
  raise RuntimeError(error_message) from exc_chain
510
533
 
511
534
  if self._commit_sha:
@@ -985,15 +1008,34 @@ _GIT_CLONE_ERROR_HINTS: list[tuple[str, str]] = [
985
1008
  ]
986
1009
 
987
1010
 
1011
+ def _decode_stderr(exc: subprocess.CalledProcessError) -> str:
1012
+ """Decode a CalledProcessError's stderr to text, tolerating bytes/None."""
1013
+ if not exc.stderr:
1014
+ return ""
1015
+ if isinstance(exc.stderr, bytes):
1016
+ return exc.stderr.decode("utf-8", errors="replace")
1017
+ return str(exc.stderr)
1018
+
1019
+
1020
+ def _url_auth_secrets(*urls: str) -> list[str]:
1021
+ """Extract userinfo values from URLs so echoed auth can be redacted."""
1022
+ secrets: list[str] = []
1023
+ seen: set[str] = set()
1024
+ for url in urls:
1025
+ parsed = urlparse(url)
1026
+ for value in (parsed.username, parsed.password):
1027
+ if not value:
1028
+ continue
1029
+ for secret in (value, unquote(value)):
1030
+ if secret and secret not in seen:
1031
+ secrets.append(secret)
1032
+ seen.add(secret)
1033
+ return secrets
1034
+
1035
+
988
1036
  def _get_git_clone_error_hint(exc: subprocess.CalledProcessError) -> str | None:
989
1037
  """Extract a resolution hint from a git clone CalledProcessError's stderr."""
990
- stderr = ""
991
- if exc.stderr:
992
- stderr = (
993
- exc.stderr.decode("utf-8", errors="replace")
994
- if isinstance(exc.stderr, bytes)
995
- else str(exc.stderr)
996
- )
1038
+ stderr = _decode_stderr(exc)
997
1039
  for pattern, hint in _GIT_CLONE_ERROR_HINTS:
998
1040
  if pattern.lower() in stderr.lower():
999
1041
  return hint
@@ -25,8 +25,10 @@ import prefect.server.models as models
25
25
  import prefect.server.schemas as schemas
26
26
  from prefect._internal.uuid7 import uuid7
27
27
  from prefect.client.schemas.worker_channel import (
28
+ CLEANUP_DELIVERY_CAPABILITY,
28
29
  WORK_POOL_SNAPSHOT_CAPABILITY,
29
30
  WORKER_HEARTBEAT_CAPABILITY,
31
+ WorkerChannelCapability,
30
32
  WorkerChannelCloseReason,
31
33
  WorkerChannelProtocolError,
32
34
  WorkerHelloFrame,
@@ -48,6 +50,10 @@ from prefect.server.schemas.statuses import WorkQueueStatus
48
50
  from prefect.server.utilities import subscriptions
49
51
  from prefect.server.utilities import worker_channel as worker_channel_utils
50
52
  from prefect.server.utilities.server import PrefectRouter
53
+ from prefect.server.worker_communication.cleanup_queue import (
54
+ WorkerCleanupQueue,
55
+ get_worker_cleanup_queue,
56
+ )
51
57
  from prefect.types import DateTime
52
58
  from prefect.types._datetime import now
53
59
 
@@ -61,7 +67,7 @@ router: PrefectRouter = PrefectRouter(
61
67
  )
62
68
  logger: Logger = get_logger("prefect.server.api.workers")
63
69
 
64
- _OSS_WORKER_CHANNEL_ACCEPTED_CAPABILITIES = [
70
+ _OSS_WORKER_CHANNEL_REQUIRED_CAPABILITIES: list[WorkerChannelCapability] = [
65
71
  WORKER_HEARTBEAT_CAPABILITY,
66
72
  WORK_POOL_SNAPSHOT_CAPABILITY,
67
73
  ]
@@ -183,6 +189,26 @@ class WorkerChannelWorkPoolUpdateEvent:
183
189
  changed_fields: dict[str, dict[str, Any]]
184
190
 
185
191
 
192
+ def _worker_requested_cleanup_delivery(hello: WorkerHelloFrame) -> bool:
193
+ return (
194
+ CLEANUP_DELIVERY_CAPABILITY in hello.payload.requested_capabilities
195
+ and bool(hello.payload.handled_cleanup_kinds)
196
+ and hello.payload.max_cleanup_concurrency > 0
197
+ )
198
+
199
+
200
+ def _accepted_worker_channel_capabilities(
201
+ hello: WorkerHelloFrame,
202
+ *,
203
+ cleanup_queue_available: bool,
204
+ ) -> list[WorkerChannelCapability]:
205
+ accepted = list(_OSS_WORKER_CHANNEL_REQUIRED_CAPABILITIES)
206
+ if cleanup_queue_available and _worker_requested_cleanup_delivery(hello):
207
+ accepted.append(CLEANUP_DELIVERY_CAPABILITY)
208
+
209
+ return accepted
210
+
211
+
186
212
  async def _receive_worker_hello(websocket: WebSocket) -> WorkerHelloFrame:
187
213
  try:
188
214
  message = await websocket.receive_json()
@@ -290,6 +316,7 @@ async def _build_worker_ready_frame(
290
316
  session: AsyncSession,
291
317
  work_pool_name: str,
292
318
  hello: WorkerHelloFrame,
319
+ cleanup_queue_available: bool,
293
320
  ) -> tuple[WorkerReadyFrame, WorkerChannelWorkPoolUpdateEvent | None]:
294
321
  try:
295
322
  selected_channel_version = select_worker_channel_version(
@@ -371,7 +398,10 @@ async def _build_worker_ready_frame(
371
398
  )
372
399
 
373
400
  requested_capabilities = list(dict.fromkeys(hello.payload.requested_capabilities))
374
- accepted = _OSS_WORKER_CHANNEL_ACCEPTED_CAPABILITIES
401
+ accepted = _accepted_worker_channel_capabilities(
402
+ hello,
403
+ cleanup_queue_available=cleanup_queue_available,
404
+ )
375
405
  accepted_set = set(accepted)
376
406
  rejected = [
377
407
  capability
@@ -393,7 +423,11 @@ async def _build_worker_ready_frame(
393
423
  ),
394
424
  "accepted_capabilities": accepted,
395
425
  "rejected_capabilities": rejected,
396
- "effective_max_cleanup_concurrency": 0,
426
+ "effective_max_cleanup_concurrency": (
427
+ hello.payload.max_cleanup_concurrency
428
+ if CLEANUP_DELIVERY_CAPABILITY in accepted_set
429
+ else 0
430
+ ),
397
431
  "resolved_work_queues": [
398
432
  {"id": work_queue.id, "name": work_queue.name}
399
433
  for work_queue in work_queues
@@ -1058,6 +1092,16 @@ async def worker_channel_connect(
1058
1092
 
1059
1093
  try:
1060
1094
  hello = await _receive_worker_hello(websocket)
1095
+ cleanup_queue: WorkerCleanupQueue | None = None
1096
+ if _worker_requested_cleanup_delivery(hello):
1097
+ try:
1098
+ cleanup_queue = get_worker_cleanup_queue()
1099
+ except Exception:
1100
+ logger.exception(
1101
+ "Worker cleanup delivery queue initialization failed; "
1102
+ "rejecting cleanup delivery capability"
1103
+ )
1104
+
1061
1105
  async with worker_channel_utils.messaging.ephemeral_subscription(
1062
1106
  worker_channel_utils.WORKER_CHANNEL_SNAPSHOT_TOPIC,
1063
1107
  ) as consumer_kwargs:
@@ -1066,6 +1110,7 @@ async def worker_channel_connect(
1066
1110
  session=session,
1067
1111
  work_pool_name=work_pool_name,
1068
1112
  hello=hello,
1113
+ cleanup_queue_available=cleanup_queue is not None,
1069
1114
  )
1070
1115
 
1071
1116
  if work_pool_update_event is not None:
@@ -1094,6 +1139,17 @@ async def worker_channel_connect(
1094
1139
  work_pool_id=ready.payload.initial_snapshot.work_pool.id,
1095
1140
  consumer_id=hello.payload.consumer_id,
1096
1141
  worker_name=hello.payload.worker_name,
1142
+ cleanup_queue=(
1143
+ cleanup_queue
1144
+ if CLEANUP_DELIVERY_CAPABILITY
1145
+ in ready.payload.accepted_capabilities
1146
+ else None
1147
+ ),
1148
+ cleanup_kinds=tuple(hello.payload.handled_cleanup_kinds),
1149
+ cleanup_work_queue_ids=tuple(
1150
+ work_queue.id for work_queue in ready.payload.resolved_work_queues
1151
+ ),
1152
+ max_cleanup_concurrency=ready.payload.effective_max_cleanup_concurrency,
1097
1153
  )
1098
1154
  await connection.run(ready, consumer_kwargs)
1099
1155
 
@@ -118,3 +118,5 @@ from prefect.settings.context import get_current_settings
118
118
  settings = get_current_settings()
119
119
  value = settings.server.services.my_service.my_setting
120
120
  ```
121
+
122
+ `temporary_settings()` accepts both legacy `Setting` objects and dotted-path string keys (e.g., `"server.api.host"`) or uppercase env var names (e.g., `"PREFECT_SERVER_API_HOST"`). Prefer string keys in new tests to avoid importing legacy `Setting` objects.
@@ -140,6 +140,9 @@ SettingAccessor: TypeAlias = Literal[
140
140
  "server.register_blocks_on_start",
141
141
  "server.services.cancellation_cleanup.enabled",
142
142
  "server.services.cancellation_cleanup.loop_seconds",
143
+ "server.services.cleanup_reconciler.batch_size",
144
+ "server.services.cleanup_reconciler.enabled",
145
+ "server.services.cleanup_reconciler.loop_seconds",
143
146
  "server.services.db_vacuum.batch_size",
144
147
  "server.services.db_vacuum.enabled",
145
148
  "server.services.db_vacuum.event_retention_overrides",
@@ -542,6 +542,33 @@ class ServerServicesRepossessorSettings(ServicesBaseSetting):
542
542
  )
543
543
 
544
544
 
545
+ class ServerServicesCleanupReconcilerSettings(ServicesBaseSetting):
546
+ """
547
+ Settings for controlling the cleanup reconciler service.
548
+ """
549
+
550
+ model_config: ClassVar[SettingsConfigDict] = build_settings_config(
551
+ ("server", "services", "cleanup_reconciler")
552
+ )
553
+
554
+ enabled: bool = Field(
555
+ default=True,
556
+ description="Whether or not to start the cleanup reconciler service in the server application.",
557
+ )
558
+
559
+ loop_seconds: float = Field(
560
+ default=5,
561
+ gt=0,
562
+ description="The cleanup reconciler service will look for expired cleanup message leases this often. Defaults to `5`.",
563
+ )
564
+
565
+ batch_size: int = Field(
566
+ default=100,
567
+ gt=0,
568
+ description="The maximum number of expired cleanup message leases to process per service loop. Defaults to `100`.",
569
+ )
570
+
571
+
545
572
  class ServerServicesTaskRunRecorderSettings(ServicesBaseSetting):
546
573
  """
547
574
  Settings for controlling the task run recorder service
@@ -677,6 +704,10 @@ class ServerServicesSettings(PrefectBaseSettings):
677
704
  default_factory=ServerServicesRepossessorSettings,
678
705
  description="Settings for controlling the repossessor service",
679
706
  )
707
+ cleanup_reconciler: ServerServicesCleanupReconcilerSettings = Field(
708
+ default_factory=ServerServicesCleanupReconcilerSettings,
709
+ description="Settings for controlling the cleanup reconciler service",
710
+ )
680
711
  task_run_recorder: ServerServicesTaskRunRecorderSettings = Field(
681
712
  default_factory=ServerServicesTaskRunRecorderSettings,
682
713
  description="Settings for controlling the task run recorder service",
@@ -20,8 +20,8 @@ class ServerWorkerChannelSettings(PrefectBaseSettings):
20
20
  description=(
21
21
  "The module to use for storing worker cleanup delivery messages. "
22
22
  "The default in-memory backend stores messages, leases, wakeups, "
23
- "and dead-letter entries only in the current server process; use a "
24
- "Redis-backed storage module for high availability or restart-safe "
23
+ "and dead-letter entries only in the current server process; use "
24
+ "an external storage module for high availability or restart-safe "
25
25
  "cleanup delivery."
26
26
  ),
27
27
  )
@@ -47,8 +47,8 @@ class ServerWorkerChannelSettings(PrefectBaseSettings):
47
47
  description=(
48
48
  "How long completed cleanup idempotency records are retained after "
49
49
  "acknowledgement. None keeps them for the lifetime of the current "
50
- "server process. The in-memory backend does not survive restart; "
51
- "use Redis for high availability or restart-safe cleanup "
50
+ "server process. The in-memory backend does not survive restart; use "
51
+ "external storage for high availability or restart-safe cleanup "
52
52
  "idempotency."
53
53
  ),
54
54
  )
@@ -333,7 +333,8 @@ def parse_obj_as(
333
333
  origin: Optional[Any] = get_origin(type_)
334
334
  if origin is list and isinstance(data, dict):
335
335
  values_dict: dict[Any, Any] = data
336
- data = next(iter(values_dict.values()))
336
+ if values_dict:
337
+ data = next(iter(values_dict.values()))
337
338
 
338
339
  parser: Callable[[Any], T] = getattr(adapter, f"validate_{mode}")
339
340
 
@@ -1,5 +0,0 @@
1
- # Generated by versioningit
2
- __version__ = "3.7.3.dev6"
3
- __build_date__ = "2026-05-30 08:54:03.385213+00:00"
4
- __git_commit__ = "15f3e133815e8e0b549a87f3b5008745f850370b"
5
- __dirty__ = False
@@ -1,29 +0,0 @@
1
- from urllib.parse import urlparse, urlunparse
2
-
3
-
4
- def strip_auth_from_url(url: str) -> str:
5
- """
6
- Remove authentication credentials (username/password) from a URL.
7
-
8
- Useful for sanitizing URLs before including them in error messages
9
- or logs to avoid leaking secrets.
10
- """
11
- parsed = urlparse(url)
12
-
13
- if not parsed.hostname:
14
- return url
15
-
16
- netloc = parsed.hostname
17
- if parsed.port:
18
- netloc = f"{netloc}:{parsed.port}"
19
-
20
- return urlunparse(
21
- (
22
- parsed.scheme,
23
- netloc,
24
- parsed.path,
25
- parsed.params,
26
- parsed.query,
27
- parsed.fragment,
28
- )
29
- )