prefect-client 3.8.7.dev7__tar.gz → 3.8.8__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 (459) hide show
  1. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/PKG-INFO +1 -1
  2. prefect_client-3.8.8/src/prefect/_build_info.py +5 -0
  3. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/services.py +33 -12
  4. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/plugins/collections.py +24 -4
  5. prefect_client-3.8.8/src/prefect/_internal/server_maintenance.py +46 -0
  6. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/notifications.py +10 -9
  7. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/redis.py +1 -1
  8. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/system.py +1 -1
  9. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/webhook.py +1 -1
  10. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/cache_policies.py +3 -3
  11. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/base.py +52 -4
  12. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/filesystems.py +19 -13
  13. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/runner.py +8 -1
  14. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/task_engine.py +22 -10
  15. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/tasks.py +3 -0
  16. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/callables/__init__.py +11 -3
  17. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/filesystem/AGENTS.md +1 -1
  18. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/filesystem/__init__.py +10 -1
  19. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/schema_tools/validation.py +5 -2
  20. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/templating/__init__.py +9 -2
  21. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/AGENTS.md +1 -0
  22. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/base.py +53 -32
  23. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/process.py +1 -1
  24. prefect_client-3.8.8/src/prefect/workers/server.py +128 -0
  25. prefect_client-3.8.7.dev7/src/prefect/_build_info.py +0 -5
  26. prefect_client-3.8.7.dev7/src/prefect/workers/server.py +0 -66
  27. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/.gitignore +0 -0
  28. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/LICENSE +0 -0
  29. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/README.md +0 -0
  30. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/hatch_build.py +0 -0
  31. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/pyproject.toml +0 -0
  32. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/.prefectignore +0 -0
  33. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/AGENTS.md +0 -0
  34. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/__init__.py +0 -0
  35. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/__main__.py +0 -0
  36. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/__init__.py +0 -0
  37. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/_launchers.py +0 -0
  38. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/bundles/__init__.py +0 -0
  39. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/bundles/execute.py +0 -0
  40. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/plugins/__init__.py +0 -0
  41. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/plugins/apply.py +0 -0
  42. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  43. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/plugins/manager.py +0 -0
  44. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/plugins/spec.py +0 -0
  45. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/sla/__init__.py +0 -0
  46. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/sla/client.py +0 -0
  47. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_experimental/sla/objects.py +0 -0
  48. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_flow_run_suspension.py +0 -0
  49. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/__init__.py +0 -0
  50. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/_logging.py +0 -0
  51. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/__init__.py +0 -0
  52. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  53. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/client.py +0 -0
  54. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/device_id.py +0 -0
  55. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/emit.py +0 -0
  56. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/enabled.py +0 -0
  57. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/events.py +0 -0
  58. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/milestones.py +0 -0
  59. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/notice.py +0 -0
  60. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/analytics/service.py +0 -0
  61. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/ast_utils.py +0 -0
  62. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/attempt_control.py +0 -0
  63. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/buildx.py +0 -0
  64. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/compatibility/__init__.py +0 -0
  65. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  66. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/compatibility/backports.py +0 -0
  67. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/compatibility/blocks.py +0 -0
  68. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  69. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  70. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/compatibility/migration.py +0 -0
  71. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/compatibility/starlette.py +0 -0
  72. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/__init__.py +0 -0
  73. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/api.py +0 -0
  74. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/calls.py +0 -0
  75. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  76. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  77. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/inspection.py +0 -0
  78. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/primitives.py +0 -0
  79. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/threads.py +0 -0
  80. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/concurrency/waiters.py +0 -0
  81. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/control_listener.py +0 -0
  82. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/deprecated.py +0 -0
  83. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/engine.py +0 -0
  84. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/git.py +0 -0
  85. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  86. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/installation.py +0 -0
  87. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/integrations.py +0 -0
  88. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/launchers.py +0 -0
  89. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/lazy.py +0 -0
  90. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/metrics.py +0 -0
  91. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/observability.py +0 -0
  92. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/observers.py +0 -0
  93. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/plugins/__init__.py +0 -0
  94. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/plugins/apply.py +0 -0
  95. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  96. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/plugins/manager.py +0 -0
  97. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/plugins/spec.py +0 -0
  98. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/plugins/startup.py +0 -0
  99. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/pydantic/__init__.py +0 -0
  100. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/pydantic/schemas.py +0 -0
  101. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  102. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  103. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  104. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/pytz.py +0 -0
  105. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/result_records.py +0 -0
  106. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/retries.py +0 -0
  107. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/schema.py +0 -0
  108. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/schemas/__init__.py +0 -0
  109. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/schemas/_registry.py +0 -0
  110. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/schemas/bases.py +0 -0
  111. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/schemas/fields.py +0 -0
  112. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/schemas/serializers.py +0 -0
  113. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/schemas/validators.py +0 -0
  114. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  115. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/states.py +0 -0
  116. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/testing.py +0 -0
  117. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/urls.py +0 -0
  118. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/uuid7.py +0 -0
  119. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/version_checking.py +0 -0
  120. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/versioning.py +0 -0
  121. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/waiters.py +0 -0
  122. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_internal/websockets.py +0 -0
  123. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/__init__.py +0 -0
  124. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/fetcher.py +0 -0
  125. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/generator.py +0 -0
  126. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/models.py +0 -0
  127. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/naming.py +0 -0
  128. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/renderer.py +0 -0
  129. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/schema_converter.py +0 -0
  130. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/templates/__init__.py +0 -0
  131. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  132. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/types.py +0 -0
  133. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_sdk/unions.py +0 -0
  134. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_vendor/croniter/__init__.py +0 -0
  135. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/_vendor/croniter/croniter.py +0 -0
  136. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/agent.py +0 -0
  137. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/analytics/__init__.py +0 -0
  138. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/artifacts.py +0 -0
  139. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/assets/__init__.py +0 -0
  140. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/assets/core.py +0 -0
  141. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/assets/materialize.py +0 -0
  142. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/automations.py +0 -0
  143. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/AGENTS.md +0 -0
  144. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/__init__.py +0 -0
  145. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/abstract.py +0 -0
  146. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/core.py +0 -0
  147. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/blocks/fields.py +0 -0
  148. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/bundles/__init__.py +0 -0
  149. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/bundles/_file_collector.py +0 -0
  150. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/bundles/_ignore_filter.py +0 -0
  151. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/bundles/_path_resolver.py +0 -0
  152. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/bundles/_zip_builder.py +0 -0
  153. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/bundles/_zip_extractor.py +0 -0
  154. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/bundles/execute.py +0 -0
  155. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/AGENTS.md +0 -0
  156. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/__init__.py +0 -0
  157. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/attribution.py +0 -0
  158. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/cloud.py +0 -0
  159. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/collections.py +0 -0
  160. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/constants.py +0 -0
  161. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/__init__.py +0 -0
  162. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  163. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  164. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  165. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_automations/client.py +0 -0
  166. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  167. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  168. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  169. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  170. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  171. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  172. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  173. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  174. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  175. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  176. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  177. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_events/client.py +0 -0
  178. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  179. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  180. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  181. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_flows/client.py +0 -0
  182. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  183. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_logs/client.py +0 -0
  184. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  185. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_variables/client.py +0 -0
  186. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  187. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  188. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/base.py +0 -0
  189. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/orchestration/routes.py +0 -0
  190. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/__init__.py +0 -0
  191. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/actions.py +0 -0
  192. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/events.py +0 -0
  193. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/filters.py +0 -0
  194. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/objects.py +0 -0
  195. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/responses.py +0 -0
  196. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/schedules.py +0 -0
  197. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/sorting.py +0 -0
  198. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/schemas/worker_channel.py +0 -0
  199. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/subscriptions.py +0 -0
  200. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/types/__init__.py +0 -0
  201. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  202. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/client/utilities.py +0 -0
  203. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/AGENTS.md +0 -0
  204. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/__init__.py +0 -0
  205. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/_asyncio.py +0 -0
  206. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/_events.py +0 -0
  207. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/_leases.py +0 -0
  208. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/_sync.py +0 -0
  209. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/asyncio.py +0 -0
  210. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/context.py +0 -0
  211. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/services.py +0 -0
  212. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/sync.py +0 -0
  213. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/v1/__init__.py +0 -0
  214. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  215. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/v1/_events.py +0 -0
  216. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/v1/asyncio.py +0 -0
  217. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/v1/context.py +0 -0
  218. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/v1/services.py +0 -0
  219. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/concurrency/v1/sync.py +0 -0
  220. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/context.py +0 -0
  221. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/AGENTS.md +0 -0
  222. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/__init__.py +0 -0
  223. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/base.py +0 -0
  224. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/deployments.py +0 -0
  225. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/flow_runs.py +0 -0
  226. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/runner.py +0 -0
  227. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/schedules.py +0 -0
  228. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/steps/__init__.py +0 -0
  229. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/steps/core.py +0 -0
  230. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/steps/pull.py +0 -0
  231. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/deployments/steps/utility.py +0 -0
  232. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/docker/__init__.py +0 -0
  233. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/docker/_buildx.py +0 -0
  234. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/docker/docker_image.py +0 -0
  235. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/engine.py +0 -0
  236. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/AGENTS.md +0 -0
  237. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/__init__.py +0 -0
  238. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/actions.py +0 -0
  239. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/clients.py +0 -0
  240. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/filters.py +0 -0
  241. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/related.py +0 -0
  242. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/schemas/__init__.py +0 -0
  243. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/schemas/automations.py +0 -0
  244. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  245. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/schemas/events.py +0 -0
  246. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/schemas/labelling.py +0 -0
  247. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/subscribers.py +0 -0
  248. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/utilities.py +0 -0
  249. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/events/worker.py +0 -0
  250. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/exceptions.py +0 -0
  251. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/flow_engine.py +0 -0
  252. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/flow_runs.py +0 -0
  253. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/flows.py +0 -0
  254. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/futures.py +0 -0
  255. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/infrastructure/__init__.py +0 -0
  256. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/infrastructure/base.py +0 -0
  257. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  258. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  259. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  260. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  261. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  262. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  263. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/input/__init__.py +0 -0
  264. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/input/actions.py +0 -0
  265. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/input/run_input.py +0 -0
  266. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/locking/__init__.py +0 -0
  267. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/locking/_filelock.py +0 -0
  268. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/locking/filesystem.py +0 -0
  269. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/locking/memory.py +0 -0
  270. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/locking/protocol.py +0 -0
  271. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/AGENTS.md +0 -0
  272. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/__init__.py +0 -0
  273. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/clients.py +0 -0
  274. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/configuration.py +0 -0
  275. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/filters.py +0 -0
  276. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/formatters.py +0 -0
  277. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/handlers.py +0 -0
  278. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/highlighters.py +0 -0
  279. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/loggers.py +0 -0
  280. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/logging/logging.yml +0 -0
  281. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/main.py +0 -0
  282. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/plugins.py +0 -0
  283. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/py.typed +0 -0
  284. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/results.py +0 -0
  285. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/AGENTS.md +0 -0
  286. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/__init__.py +0 -0
  287. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_cancel_finalizer.py +0 -0
  288. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_cancellation_manager.py +0 -0
  289. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_control_channel.py +0 -0
  290. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_deployment_registry.py +0 -0
  291. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_event_emitter.py +0 -0
  292. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_flow_resolver.py +0 -0
  293. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_flow_run_executor.py +0 -0
  294. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_hook_runner.py +0 -0
  295. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_limit_manager.py +0 -0
  296. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_process_manager.py +0 -0
  297. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  298. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_starter_bundle.py +0 -0
  299. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_starter_direct.py +0 -0
  300. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_starter_engine.py +0 -0
  301. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_state_proposer.py +0 -0
  302. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_uv_command.py +0 -0
  303. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_workspace_hook_runner.py +0 -0
  304. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_workspace_resolver.py +0 -0
  305. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_workspace_runtime.py +0 -0
  306. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_workspace_runtime_bootstrap.py +0 -0
  307. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_workspace_starter.py +0 -0
  308. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/_workspace_supervisor.py +0 -0
  309. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/server.py +0 -0
  310. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runner/storage.py +0 -0
  311. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runtime/__init__.py +0 -0
  312. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runtime/deployment.py +0 -0
  313. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runtime/flow_run.py +0 -0
  314. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/runtime/task_run.py +0 -0
  315. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/schedules.py +0 -0
  316. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/serializers.py +0 -0
  317. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/__init__.py +0 -0
  318. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/_ui_static.py +0 -0
  319. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/admin.py +0 -0
  320. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/artifacts.py +0 -0
  321. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/automations.py +0 -0
  322. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/background_workers.py +0 -0
  323. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/block_capabilities.py +0 -0
  324. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/block_documents.py +0 -0
  325. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/block_schemas.py +0 -0
  326. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/block_types.py +0 -0
  327. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/clients.py +0 -0
  328. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/collections.py +0 -0
  329. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  330. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/concurrency_limits.py +0 -0
  331. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  332. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/csrf_token.py +0 -0
  333. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/dependencies.py +0 -0
  334. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/deployments.py +0 -0
  335. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/events.py +0 -0
  336. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/flow_run_states.py +0 -0
  337. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/flow_runs.py +0 -0
  338. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/flows.py +0 -0
  339. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/logs.py +0 -0
  340. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/middleware.py +0 -0
  341. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/root.py +0 -0
  342. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/run_history.py +0 -0
  343. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/saved_searches.py +0 -0
  344. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/server.py +0 -0
  345. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  346. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/task_run_states.py +0 -0
  347. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/task_runs.py +0 -0
  348. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/task_workers.py +0 -0
  349. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/templates.py +0 -0
  350. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/ui/__init__.py +0 -0
  351. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/ui/flow_runs.py +0 -0
  352. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/ui/flows.py +0 -0
  353. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/ui/schemas.py +0 -0
  354. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/ui/task_runs.py +0 -0
  355. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/validation.py +0 -0
  356. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/variables.py +0 -0
  357. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/work_queues.py +0 -0
  358. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/server/api/workers.py +0 -0
  359. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/AGENTS.md +0 -0
  360. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/__init__.py +0 -0
  361. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/_types.py +0 -0
  362. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/base.py +0 -0
  363. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/constants.py +0 -0
  364. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/context.py +0 -0
  365. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/legacy.py +0 -0
  366. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/__init__.py +0 -0
  367. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/_defaults.py +0 -0
  368. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/api.py +0 -0
  369. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/cli.py +0 -0
  370. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/client.py +0 -0
  371. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/cloud.py +0 -0
  372. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/deployments.py +0 -0
  373. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/events.py +0 -0
  374. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/experiments.py +0 -0
  375. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/flows.py +0 -0
  376. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/internal.py +0 -0
  377. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/logging.py +0 -0
  378. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/plugins.py +0 -0
  379. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/results.py +0 -0
  380. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/root.py +0 -0
  381. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/runner.py +0 -0
  382. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/__init__.py +0 -0
  383. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/api.py +0 -0
  384. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/concurrency.py +0 -0
  385. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/database.py +0 -0
  386. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/deployments.py +0 -0
  387. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/docket.py +0 -0
  388. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/ephemeral.py +0 -0
  389. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/events.py +0 -0
  390. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  391. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/logs.py +0 -0
  392. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/root.py +0 -0
  393. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/services.py +0 -0
  394. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/tasks.py +0 -0
  395. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/ui.py +0 -0
  396. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/server/worker_channel.py +0 -0
  397. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/tasks.py +0 -0
  398. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/telemetry.py +0 -0
  399. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/testing.py +0 -0
  400. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/models/worker.py +0 -0
  401. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/profiles.py +0 -0
  402. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/profiles.toml +0 -0
  403. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/settings/sources.py +0 -0
  404. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/states.py +0 -0
  405. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/task_runners.py +0 -0
  406. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/task_runs.py +0 -0
  407. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/task_worker.py +0 -0
  408. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/telemetry/__init__.py +0 -0
  409. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/telemetry/run_telemetry.py +0 -0
  410. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/transactions.py +0 -0
  411. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/types/__init__.py +0 -0
  412. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/types/_concurrency.py +0 -0
  413. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/types/_datetime.py +0 -0
  414. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/types/entrypoint.py +0 -0
  415. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/types/names.py +0 -0
  416. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/AGENTS.md +0 -0
  417. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/__init__.py +0 -0
  418. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/annotations.py +0 -0
  419. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  420. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  421. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/callables/AGENTS.md +0 -0
  422. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/collections.py +0 -0
  423. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/compat.py +0 -0
  424. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/context.py +0 -0
  425. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/dispatch.py +0 -0
  426. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/dockerutils.py +0 -0
  427. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/engine/AGENTS.md +0 -0
  428. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/engine/__init__.py +0 -0
  429. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/generics.py +0 -0
  430. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/hashing.py +0 -0
  431. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/importtools.py +0 -0
  432. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/math.py +0 -0
  433. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/names.py +0 -0
  434. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  435. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/processutils/__init__.py +0 -0
  436. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/pydantic.py +0 -0
  437. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/render_swagger.py +0 -0
  438. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  439. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  440. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  441. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/services.py +0 -0
  442. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/slugify.py +0 -0
  443. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/templating/AGENTS.md +0 -0
  444. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/text.py +0 -0
  445. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/timeout.py +0 -0
  446. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/urls.py +0 -0
  447. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/utilities/visualization.py +0 -0
  448. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/variables.py +0 -0
  449. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/__init__.py +0 -0
  450. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/_cleanup.py +0 -0
  451. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/_cleanup_handlers.py +0 -0
  452. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  453. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  454. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/_worker_channel/_state.py +0 -0
  455. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  456. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  457. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/block.py +0 -0
  458. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/cloud.py +0 -0
  459. {prefect_client-3.8.7.dev7 → prefect_client-3.8.8}/src/prefect/workers/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: prefect-client
3
- Version: 3.8.7.dev7
3
+ Version: 3.8.8
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.8.8"
3
+ __build_date__ = "2026-10-06 16:30:43.356618+00:00"
4
+ __git_commit__ = "b73b09dc3699489c799dbb40ac5ed2da459e391c"
5
+ __dirty__ = False
@@ -57,6 +57,9 @@ if hasattr(os, "register_at_fork"):
57
57
  class _QueueServiceBase(abc.ABC, Generic[T]):
58
58
  _instances: dict[int, Self] = {}
59
59
  _instance_lock = threading.Lock()
60
+ # Keep cache access separate from startup serialization: instance() waits for
61
+ # the global loop, whose service cleanup must be able to evict instances.
62
+ _instance_cache_lock = threading.Lock()
60
63
  _max_queue_size: int = 0 # 0 means unbounded
61
64
 
62
65
  def __init__(self, *args: Hashable) -> None:
@@ -96,6 +99,7 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
96
99
  """Reset class-level state after fork() to prevent deadlocks in child process."""
97
100
  cls._instances.clear()
98
101
  cls._instance_lock = threading.Lock()
102
+ cls._instance_cache_lock = threading.Lock()
99
103
 
100
104
  def start(self) -> None:
101
105
  logger.debug("Starting service %r", self)
@@ -281,7 +285,8 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
281
285
  """
282
286
  futures: list[concurrent.futures.Future[bool]] = []
283
287
  with cls._instance_lock:
284
- instances = tuple(cls._instances.values())
288
+ with cls._instance_cache_lock:
289
+ instances = tuple(cls._instances.values())
285
290
 
286
291
  for instance in instances:
287
292
  futures.append(instance._drain(at_exit=at_exit))
@@ -312,28 +317,44 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
312
317
  """
313
318
  with cls._instance_lock:
314
319
  key = hash((cls, *args))
315
- if key not in cls._instances:
316
- cls._instances[key] = cls._new_instance(*args)
320
+ with cls._instance_cache_lock:
321
+ instance = cls._instances.get(key)
322
+ if instance is None or instance._stopped:
323
+ instance = cls._new_instance(*args)
317
324
 
318
- return cls._instances[key]
325
+ return instance
319
326
 
320
327
  def _remove_instance(self):
321
- self._instances.pop(self._key, None)
328
+ # Only evict this instance; a newer instance may already be cached under
329
+ # the same key
330
+ with self._instance_cache_lock:
331
+ if self._instances.get(self._key) is self:
332
+ self._instances.pop(self._key, None)
322
333
 
323
334
  @classmethod
324
335
  def _new_instance(cls, *args: Hashable) -> Self:
325
336
  """
326
- Create and start a new instance of the service.
337
+ Create, cache, and start a new instance of the service.
327
338
  """
328
339
  instance = cls(*args)
329
340
 
330
- # If already on the global loop, just start it here to avoid deadlock
331
- if threading.get_ident() == get_global_loop().thread.ident:
332
- instance.start()
341
+ # Cache before starting so that a service which stops while starting, e.g.
342
+ # because its lifespan failed, evicts itself instead of being cached after
343
+ # it has already stopped
344
+ with cls._instance_cache_lock:
345
+ cls._instances[instance._key] = instance
333
346
 
334
- # Otherwise, bind the service to the global loop
335
- else:
336
- from_sync.call_soon_in_loop_thread(create_call(instance.start)).result()
347
+ try:
348
+ # If already on the global loop, just start it here to avoid deadlock
349
+ if threading.get_ident() == get_global_loop().thread.ident:
350
+ instance.start()
351
+
352
+ # Otherwise, bind the service to the global loop
353
+ else:
354
+ from_sync.call_soon_in_loop_thread(create_call(instance.start)).result()
355
+ except BaseException:
356
+ instance._remove_instance()
357
+ raise
337
358
 
338
359
  return instance
339
360
 
@@ -8,6 +8,7 @@ typically to register Blocks or other Prefect-aware classes.
8
8
  Public API is re-exported from `prefect.plugins`.
9
9
  """
10
10
 
11
+ import importlib
11
12
  from importlib.metadata import EntryPoints, entry_points
12
13
  from types import ModuleType
13
14
  from typing import Any, Union
@@ -40,26 +41,45 @@ def safe_load_entrypoints(entrypoints: EntryPoints) -> dict[str, Union[Exception
40
41
  return results
41
42
 
42
43
 
43
- def load_prefect_collections() -> dict[str, Union[ModuleType, Exception]]:
44
+ def load_prefect_collections(
45
+ reload: bool = False,
46
+ ) -> dict[str, Union[ModuleType, Exception]]:
44
47
  """
45
48
  Load all Prefect collections that define an entrypoint in the group
46
49
  `prefect.collections`.
50
+
51
+ Results are cached. With `reload=True`, import and metadata caches are
52
+ invalidated and entry points that are new or failed on a previous call are
53
+ loaded, so packages installed or repaired after the first call are picked up.
47
54
  """
48
55
  global _collections
49
56
 
50
- if _collections is not None:
57
+ if _collections is not None and not reload:
51
58
  return _collections
52
59
 
60
+ if _collections is not None:
61
+ importlib.invalidate_caches()
62
+
53
63
  collection_entrypoints: EntryPoints = entry_points(group="prefect.collections")
54
- collections: dict[str, Union[Exception, Any]] = safe_load_entrypoints(
64
+ if _collections is not None:
65
+ known = {
66
+ name
67
+ for name, result in _collections.items()
68
+ if not isinstance(result, Exception)
69
+ }
70
+ collection_entrypoints = EntryPoints(
71
+ ep for ep in collection_entrypoints if (ep.name or ep.value) not in known
72
+ )
73
+ loaded: dict[str, Union[Exception, Any]] = safe_load_entrypoints(
55
74
  collection_entrypoints
56
75
  )
76
+ collections = {**_collections, **loaded} if _collections is not None else loaded
57
77
 
58
78
  # TODO: Consider the utility of this once we've established this pattern.
59
79
  # We cannot use a logger here because logging is not yet initialized.
60
80
  # It would be nice if logging was initialized so we could log failures
61
81
  # at least.
62
- for name, result in collections.items():
82
+ for name, result in loaded.items():
63
83
  if isinstance(result, Exception):
64
84
  print(
65
85
  # TODO: Use exc_info if we have a logger
@@ -0,0 +1,46 @@
1
+ """
2
+ Process-wide record of requests waiting out Prefect API maintenance.
3
+
4
+ When the API answers with a `Prefect-Maintenance: true` header, the HTTP clients
5
+ retry indefinitely, sleeping for the `Retry-After` they were given. Health checks
6
+ read this record so that a process deliberately waiting is not reported as stuck.
7
+ """
8
+
9
+ import datetime
10
+ import threading
11
+
12
+ import prefect.types._datetime
13
+
14
+ _backoff_ends_at: datetime.datetime | None = None
15
+ _backoff_lock = threading.Lock()
16
+
17
+
18
+ def record_maintenance_backoff(retry_seconds: float) -> None:
19
+ """
20
+ Record that a request is sleeping for `retry_seconds` before retrying a
21
+ maintenance response.
22
+ """
23
+ global _backoff_ends_at
24
+ ends_at = prefect.types._datetime.now("UTC") + datetime.timedelta(
25
+ seconds=retry_seconds
26
+ )
27
+ with _backoff_lock:
28
+ # Concurrent requests each back off; the latest end wins.
29
+ if _backoff_ends_at is None or ends_at > _backoff_ends_at:
30
+ _backoff_ends_at = ends_at
31
+
32
+
33
+ def maintenance_backoff_ends_at() -> datetime.datetime | None:
34
+ """
35
+ When the latest maintenance back-off in this process ends, or `None` if no
36
+ request has backed off for maintenance.
37
+ """
38
+ with _backoff_lock:
39
+ return _backoff_ends_at
40
+
41
+
42
+ def reset_maintenance_backoff() -> None:
43
+ """Forget any recorded maintenance back-off (for tests)."""
44
+ global _backoff_ends_at
45
+ with _backoff_lock:
46
+ _backoff_ends_at = None
@@ -170,7 +170,7 @@ class SlackWebhook(AppriseNotificationBlock):
170
170
 
171
171
  _block_type_name = "Slack Webhook"
172
172
  _logo_url = HttpUrl(
173
- "https://cdn.sanity.io/images/3ugk85nk/production/c1965ecbf8704ee1ea20d77786de9a41ce1087d1-500x500.png"
173
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/slack.png"
174
174
  )
175
175
  _documentation_url = HttpUrl(
176
176
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -267,7 +267,7 @@ class MicrosoftTeamsWebhook(AppriseNotificationBlock):
267
267
  _block_type_name = "Microsoft Teams Webhook"
268
268
  _block_type_slug = "ms-teams-webhook"
269
269
  _logo_url = HttpUrl(
270
- "https://cdn.sanity.io/images/3ugk85nk/production/817efe008a57f0a24f3587414714b563e5e23658-250x250.png"
270
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/microsoft-teams.png"
271
271
  )
272
272
  _documentation_url = HttpUrl(
273
273
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -329,7 +329,7 @@ class PagerDutyWebHook(AbstractAppriseNotificationBlock):
329
329
  _block_type_name = "Pager Duty Webhook"
330
330
  _block_type_slug = "pager-duty-webhook"
331
331
  _logo_url = HttpUrl(
332
- "https://cdn.sanity.io/images/3ugk85nk/production/8dbf37d17089c1ce531708eac2e510801f7b3aee-250x250.png"
332
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/pagerduty.png"
333
333
  )
334
334
  _documentation_url = HttpUrl(
335
335
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -485,7 +485,7 @@ class TwilioSMS(AbstractAppriseNotificationBlock):
485
485
  _block_type_name = "Twilio SMS"
486
486
  _block_type_slug = "twilio-sms"
487
487
  _logo_url = HttpUrl(
488
- "https://cdn.sanity.io/images/3ugk85nk/production/8bd8777999f82112c09b9c8d57083ac75a4a0d65-250x250.png"
488
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/twilio.png"
489
489
  ) # noqa
490
490
  _documentation_url = HttpUrl(
491
491
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -560,7 +560,7 @@ class OpsgenieWebhook(AbstractAppriseNotificationBlock):
560
560
  _block_type_name = "Opsgenie Webhook"
561
561
  _block_type_slug = "opsgenie-webhook"
562
562
  _logo_url = HttpUrl(
563
- "https://cdn.sanity.io/images/3ugk85nk/production/d8b5bc6244ae6cd83b62ec42f10d96e14d6e9113-280x280.png"
563
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/opsgenie.png"
564
564
  )
565
565
  _documentation_url = HttpUrl(
566
566
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -685,7 +685,7 @@ class MattermostWebhook(AbstractAppriseNotificationBlock):
685
685
  _block_type_name = "Mattermost Webhook"
686
686
  _block_type_slug = "mattermost-webhook"
687
687
  _logo_url = HttpUrl(
688
- "https://cdn.sanity.io/images/3ugk85nk/production/1350a147130bf82cbc799a5f868d2c0116207736-250x250.png"
688
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/mattermost.png"
689
689
  )
690
690
  _documentation_url = HttpUrl(
691
691
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -751,6 +751,7 @@ class MattermostWebhook(AbstractAppriseNotificationBlock):
751
751
  token=self.token.get_secret_value(),
752
752
  fullpath=self.path,
753
753
  host=self.hostname,
754
+ user=self.botname,
754
755
  targets=self.channels,
755
756
  include_image=self.include_image,
756
757
  port=self.port,
@@ -786,7 +787,7 @@ class DiscordWebhook(AbstractAppriseNotificationBlock):
786
787
  _block_type_name = "Discord Webhook"
787
788
  _block_type_slug = "discord-webhook"
788
789
  _logo_url = HttpUrl(
789
- "https://cdn.sanity.io/images/3ugk85nk/production/9e94976c80ef925b66d24e5d14f0d47baa6b8f88-250x250.png"
790
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/discord.png"
790
791
  )
791
792
  _documentation_url = HttpUrl(
792
793
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -891,7 +892,7 @@ class CustomWebhookNotificationBlock(NotificationBlock):
891
892
 
892
893
  _block_type_name = "Custom Webhook"
893
894
  _logo_url = HttpUrl(
894
- "https://cdn.sanity.io/images/3ugk85nk/production/c7247cb359eb6cf276734d4b1fbf00fb8930e89e-250x250.png"
895
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/webhook.png"
895
896
  )
896
897
  _documentation_url = HttpUrl(
897
898
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -1061,7 +1062,7 @@ class SendgridEmail(AbstractAppriseNotificationBlock):
1061
1062
  _block_type_name = "Sendgrid Email"
1062
1063
  _block_type_slug = "sendgrid-email"
1063
1064
  _logo_url = HttpUrl(
1064
- "https://cdn.sanity.io/images/3ugk85nk/production/82bc6ed16ca42a2252a5512c72233a253b8a58eb-250x250.png"
1065
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/email.png"
1065
1066
  )
1066
1067
  _documentation_url = HttpUrl(
1067
1068
  "https://docs.prefect.io/latest/automate/events/automations-triggers#sending-notifications-with-automations"
@@ -52,7 +52,7 @@ class RedisStorageContainer(WritableFileSystem):
52
52
  """
53
53
 
54
54
  _logo_url = HttpUrl(
55
- "https://cdn.sanity.io/images/3ugk85nk/production/dfb02cfce09ce3ca88fea097659a83554dd7a850-596x512.png"
55
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/redis.png"
56
56
  )
57
57
 
58
58
  host: Optional[str] = Field(default=None, description="Redis hostname")
@@ -45,7 +45,7 @@ class Secret(Block, Generic[T]):
45
45
  """
46
46
 
47
47
  _logo_url = HttpUrl(
48
- "https://cdn.sanity.io/images/3ugk85nk/production/c6f20e556dd16effda9df16551feecfb5822092b-48x48.png"
48
+ "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/secret.png"
49
49
  )
50
50
  _documentation_url = HttpUrl("https://docs.prefect.io/latest/develop/blocks")
51
51
  _description = "A block that represents a secret value. The value stored in this block will be obfuscated when this block is viewed or edited in the UI."
@@ -31,7 +31,7 @@ class Webhook(Block):
31
31
  """
32
32
 
33
33
  _block_type_name = "Webhook"
34
- _logo_url = "https://cdn.sanity.io/images/3ugk85nk/production/c7247cb359eb6cf276734d4b1fbf00fb8930e89e-250x250.png" # type: ignore
34
+ _logo_url = "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/webhook.png" # type: ignore
35
35
  _documentation_url = HttpUrl(
36
36
  "https://docs.prefect.io/latest/automate/events/webhook-triggers"
37
37
  )
@@ -1,7 +1,7 @@
1
1
  import inspect
2
2
  import sys
3
3
  from copy import deepcopy
4
- from dataclasses import dataclass, field
4
+ from dataclasses import dataclass, field, replace
5
5
  from logging import Logger
6
6
  from pathlib import Path
7
7
  from typing import (
@@ -255,7 +255,7 @@ class CompoundCachePolicy(CachePolicy):
255
255
 
256
256
  if inputs_policies:
257
257
  new = Inputs(exclude=[other])
258
- return CompoundCachePolicy(policies=[*self.policies, new])
258
+ return replace(self, policies=[*self.policies, new])
259
259
  else:
260
260
  # no dependency on inputs already
261
261
  return self
@@ -404,7 +404,7 @@ class Inputs(CachePolicy):
404
404
  def __sub__(self, other: str) -> "CachePolicy":
405
405
  if not isinstance(other, str): # type: ignore[reportUnnecessaryIsInstance]
406
406
  raise TypeError("Can only subtract strings from key policies.")
407
- return Inputs(exclude=self.exclude + [other])
407
+ return replace(self, exclude=self.exclude + [other])
408
408
 
409
409
 
410
410
  INPUTS = Inputs()
@@ -1,4 +1,5 @@
1
1
  import copy
2
+ import math
2
3
  import sys
3
4
  import threading
4
5
  import time
@@ -7,6 +8,7 @@ from collections import defaultdict
7
8
  from collections.abc import AsyncGenerator, Awaitable, MutableMapping
8
9
  from contextlib import asynccontextmanager
9
10
  from datetime import datetime, timezone
11
+ from email.utils import parsedate_to_datetime
10
12
  from logging import Logger
11
13
  from typing import TYPE_CHECKING, Any, Callable, Optional, Protocol, runtime_checkable
12
14
 
@@ -18,6 +20,7 @@ from typing_extensions import Self
18
20
 
19
21
  import prefect
20
22
  from prefect._internal.compatibility.starlette import status
23
+ from prefect._internal.server_maintenance import record_maintenance_backoff
21
24
  from prefect.client import constants
22
25
  from prefect.client.attribution import get_attribution_headers
23
26
  from prefect.client.schemas.objects import CsrfToken
@@ -44,6 +47,20 @@ APP_LIFESPANS_REF_COUNTS: dict[tuple[int, int], int] = {}
44
47
  APP_LIFESPANS_LOCKS: dict[int, anyio.Lock] = defaultdict(anyio.Lock)
45
48
 
46
49
 
50
+ def _record_if_maintenance_backoff(
51
+ response: Optional[Response],
52
+ exc_info: Optional[tuple[Any, ...]],
53
+ retry_seconds: float,
54
+ ) -> None:
55
+ # After a retryable exception, `response` is still the previous attempt's.
56
+ if (
57
+ exc_info is None
58
+ and response is not None
59
+ and response.headers.get("Prefect-Maintenance") == "true"
60
+ ):
61
+ record_maintenance_backoff(retry_seconds)
62
+
63
+
47
64
  logger: Logger = get_logger("client")
48
65
 
49
66
 
@@ -177,6 +194,31 @@ class PrefectResponse(httpx.Response):
177
194
  return new_response
178
195
 
179
196
 
197
+ def _parse_retry_after(value: str) -> float | None:
198
+ """
199
+ Parse a `Retry-After` header value into a number of seconds to wait.
200
+
201
+ Supports both forms allowed by RFC 9110: delay-seconds and HTTP-date. Returns
202
+ `None` if the value cannot be interpreted so callers can fall back to their
203
+ default backoff.
204
+ """
205
+ try:
206
+ seconds = float(value)
207
+ except ValueError:
208
+ try:
209
+ retry_at = parsedate_to_datetime(value)
210
+ except (TypeError, ValueError, OverflowError):
211
+ return None
212
+ if retry_at.tzinfo is None:
213
+ retry_at = retry_at.replace(tzinfo=timezone.utc)
214
+ seconds = (retry_at - datetime.now(timezone.utc)).total_seconds()
215
+
216
+ if not math.isfinite(seconds):
217
+ return None
218
+
219
+ return max(0.0, seconds)
220
+
221
+
180
222
  class PrefectHttpxAsyncClient(httpx.AsyncClient):
181
223
  """
182
224
  A Prefect wrapper for the async httpx client with support for retry-after headers
@@ -293,7 +335,9 @@ class PrefectHttpxAsyncClient(httpx.AsyncClient):
293
335
  return response
294
336
 
295
337
  if "Retry-After" in response.headers:
296
- retry_seconds = float(response.headers["Retry-After"])
338
+ retry_seconds = _parse_retry_after(response.headers["Retry-After"])
339
+
340
+ retry_after_from_header = retry_seconds is not None
297
341
 
298
342
  # Use an exponential back-off if not set in a header
299
343
  if retry_seconds is None:
@@ -302,7 +346,7 @@ class PrefectHttpxAsyncClient(httpx.AsyncClient):
302
346
  # Add jitter
303
347
  jitter_factor = PREFECT_CLIENT_RETRY_JITTER_FACTOR.value()
304
348
  if retry_seconds > 0 and jitter_factor > 0:
305
- if response is not None and "Retry-After" in response.headers:
349
+ if retry_after_from_header:
306
350
  # Always wait for _at least_ retry seconds if requested by the API
307
351
  retry_seconds = bounded_poisson_interval(
308
352
  retry_seconds, retry_seconds * (1 + jitter_factor)
@@ -327,6 +371,7 @@ class PrefectHttpxAsyncClient(httpx.AsyncClient):
327
371
  f" {try_count}/{PREFECT_CLIENT_MAX_RETRIES.value() + 1}.",
328
372
  exc_info=exc_info,
329
373
  )
374
+ _record_if_maintenance_backoff(response, exc_info, retry_seconds)
330
375
  await anyio.sleep(retry_seconds)
331
376
 
332
377
  assert response is not None, (
@@ -563,7 +608,9 @@ class PrefectHttpxSyncClient(httpx.Client):
563
608
  return response
564
609
 
565
610
  if "Retry-After" in response.headers:
566
- retry_seconds = float(response.headers["Retry-After"])
611
+ retry_seconds = _parse_retry_after(response.headers["Retry-After"])
612
+
613
+ retry_after_from_header = retry_seconds is not None
567
614
 
568
615
  # Use an exponential back-off if not set in a header
569
616
  if retry_seconds is None:
@@ -572,7 +619,7 @@ class PrefectHttpxSyncClient(httpx.Client):
572
619
  # Add jitter
573
620
  jitter_factor = PREFECT_CLIENT_RETRY_JITTER_FACTOR.value()
574
621
  if retry_seconds > 0 and jitter_factor > 0:
575
- if response is not None and "Retry-After" in response.headers:
622
+ if retry_after_from_header:
576
623
  # Always wait for _at least_ retry seconds if requested by the API
577
624
  retry_seconds = bounded_poisson_interval(
578
625
  retry_seconds, retry_seconds * (1 + jitter_factor)
@@ -597,6 +644,7 @@ class PrefectHttpxSyncClient(httpx.Client):
597
644
  f" {try_count}/{PREFECT_CLIENT_MAX_RETRIES.value() + 1}.",
598
645
  exc_info=exc_info,
599
646
  )
647
+ _record_if_maintenance_backoff(response, exc_info, retry_seconds)
600
648
  time.sleep(retry_seconds)
601
649
 
602
650
  assert response is not None, (
@@ -85,7 +85,7 @@ class LocalFileSystem(WritableFileSystem, WritableDeploymentStorage):
85
85
  """
86
86
 
87
87
  _block_type_name = "Local File System"
88
- _logo_url = "https://cdn.sanity.io/images/3ugk85nk/production/ad39089fa66d273b943394a68f003f7a19aa850e-48x48.png"
88
+ _logo_url = "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/filesystem.png"
89
89
  _documentation_url = (
90
90
  "https://docs.prefect.io/latest/develop/results#specifying-a-default-filesystem"
91
91
  )
@@ -191,13 +191,15 @@ class LocalFileSystem(WritableFileSystem, WritableDeploymentStorage):
191
191
  with open(from_path / Path(".prefectignore")) as f:
192
192
  ignore_patterns = f.readlines()
193
193
  included_files = filter_files(
194
- root=from_path, ignore_patterns=ignore_patterns
194
+ root=from_path, ignore_patterns=ignore_patterns, as_posix=True
195
195
  )
196
196
 
197
197
  def ignore_func(directory, files):
198
198
  relative_path = Path(directory).relative_to(from_path)
199
199
  files_to_ignore = [
200
- f for f in files if str(relative_path / f) not in included_files
200
+ f
201
+ for f in files
202
+ if (relative_path / f).as_posix() not in included_files
201
203
  ]
202
204
  return files_to_ignore
203
205
  else:
@@ -210,13 +212,15 @@ class LocalFileSystem(WritableFileSystem, WritableDeploymentStorage):
210
212
  async def _get_ignore_func(self, local_path: str, ignore_file: str):
211
213
  with open(ignore_file) as f:
212
214
  ignore_patterns = f.readlines()
213
- included_files = filter_files(root=local_path, ignore_patterns=ignore_patterns)
215
+ included_files = filter_files(
216
+ root=local_path, ignore_patterns=ignore_patterns, as_posix=True
217
+ )
214
218
 
215
219
  def ignore_func(directory, files):
216
220
  relative_path = Path(directory).relative_to(local_path)
217
221
 
218
222
  files_to_ignore = [
219
- f for f in files if str(relative_path / f) not in included_files
223
+ f for f in files if (relative_path / f).as_posix() not in included_files
220
224
  ]
221
225
  return files_to_ignore
222
226
 
@@ -278,13 +282,15 @@ class LocalFileSystem(WritableFileSystem, WritableDeploymentStorage):
278
282
  with open(ignore_file) as f:
279
283
  ignore_patterns = f.readlines()
280
284
  included_files = filter_files(
281
- root=local_path, ignore_patterns=ignore_patterns
285
+ root=local_path, ignore_patterns=ignore_patterns, as_posix=True
282
286
  )
283
287
 
284
288
  def ignore_func(directory, files):
285
289
  relative_path = Path(directory).relative_to(local_path)
286
290
  files_to_ignore = [
287
- f for f in files if str(relative_path / f) not in included_files
291
+ f
292
+ for f in files
293
+ if (relative_path / f).as_posix() not in included_files
288
294
  ]
289
295
  return files_to_ignore
290
296
  else:
@@ -382,7 +388,7 @@ class RemoteFileSystem(WritableFileSystem, WritableDeploymentStorage):
382
388
  """
383
389
 
384
390
  _block_type_name = "Remote File System"
385
- _logo_url = "https://cdn.sanity.io/images/3ugk85nk/production/e86b41bc0f9c99ba9489abeee83433b43d5c9365-48x48.png"
391
+ _logo_url = "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/filesystem.png"
386
392
  _documentation_url = (
387
393
  "https://docs.prefect.io/latest/develop/results#specifying-a-default-filesystem"
388
394
  )
@@ -539,13 +545,13 @@ class RemoteFileSystem(WritableFileSystem, WritableDeploymentStorage):
539
545
  ignore_patterns = f.readlines()
540
546
 
541
547
  included_files = filter_files(
542
- local_path, ignore_patterns, include_dirs=True
548
+ local_path, ignore_patterns, include_dirs=True, as_posix=True
543
549
  )
544
550
 
545
551
  counter = 0
546
552
  for f in Path(local_path).rglob("*"):
547
553
  relative_path = f.relative_to(local_path)
548
- if included_files and str(relative_path) not in included_files:
554
+ if included_files and relative_path.as_posix() not in included_files:
549
555
  continue
550
556
 
551
557
  if to_path.endswith("/"):
@@ -595,13 +601,13 @@ class RemoteFileSystem(WritableFileSystem, WritableDeploymentStorage):
595
601
  ignore_patterns = f.readlines()
596
602
 
597
603
  included_files = filter_files(
598
- local_path, ignore_patterns, include_dirs=True
604
+ local_path, ignore_patterns, include_dirs=True, as_posix=True
599
605
  )
600
606
 
601
607
  counter = 0
602
608
  for f in Path(local_path).rglob("*"):
603
609
  relative_path = f.relative_to(local_path)
604
- if included_files and str(relative_path) not in included_files:
610
+ if included_files and relative_path.as_posix() not in included_files:
605
611
  continue
606
612
 
607
613
  if to_path.endswith("/"):
@@ -701,7 +707,7 @@ class SMB(WritableFileSystem, WritableDeploymentStorage):
701
707
  """
702
708
 
703
709
  _block_type_name = "SMB"
704
- _logo_url = "https://cdn.sanity.io/images/3ugk85nk/production/3f624663f7beb97d011d011bffd51ecf6c499efc-195x195.png"
710
+ _logo_url = "https://raw.githubusercontent.com/PrefectHQ/prefect/420d0d6a78bb6df1fc18bcf188fdad43c1d22ea9/assets/block-logos/smb.png"
705
711
  _documentation_url = (
706
712
  "https://docs.prefect.io/latest/develop/results#specifying-a-default-filesystem"
707
713
  )
@@ -241,7 +241,14 @@ class Runner:
241
241
 
242
242
  if name and ("/" in name or "%" in name):
243
243
  raise ValueError("Runner name cannot contain '/' or '%'")
244
- self.name: str = Path(name).stem if name is not None else f"runner-{uuid4()}"
244
+ if name is None:
245
+ self.name: str = f"runner-{uuid4()}"
246
+ else:
247
+ # Only strip the suffix when a filename was actually passed; a `.` is
248
+ # legal in a runner name and `Path().stem` would otherwise treat
249
+ # everything after the last one as a file extension. Mirrors
250
+ # `RunnerDeployment.validate_name`.
251
+ self.name = Path(name).stem if name.endswith(".py") else name
245
252
  self._logger: "logging.Logger" = get_logger("runner")
246
253
 
247
254
  self.started: bool = False