prefect-client 3.8.9.dev7__tar.gz → 3.9.1.dev1__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 (461) hide show
  1. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/PKG-INFO +7 -6
  2. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/pyproject.toml +7 -5
  3. prefect_client-3.9.1.dev1/src/prefect/_build_info.py +5 -0
  4. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/compatibility/deprecated.py +5 -3
  5. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/services.py +33 -6
  6. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/runner.py +85 -10
  7. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/schemas/automations.py +8 -4
  8. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/AGENTS.md +2 -1
  9. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/handlers.py +40 -9
  10. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/AGENTS.md +4 -13
  11. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_process_manager.py +9 -0
  12. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_scheduled_run_poller.py +1 -2
  13. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_starter_bundle.py +0 -1
  14. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_starter_direct.py +0 -1
  15. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_starter_engine.py +2 -3
  16. prefect_client-3.9.1.dev1/src/prefect/runner/runner.py +918 -0
  17. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/server.py +1 -1
  18. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runtime/flow_run.py +7 -2
  19. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/concurrency_limits_v2.py +3 -3
  20. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/flow_runs.py +1 -2
  21. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/ui/flow_runs.py +1 -1
  22. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/ui/flows.py +2 -2
  23. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/ui/task_runs.py +4 -2
  24. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/_types.py +1 -0
  25. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/deployments.py +11 -0
  26. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/tasks.py +11 -1
  27. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/types/__init__.py +31 -1
  28. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/types/_datetime.py +80 -28
  29. prefect_client-3.9.1.dev1/src/prefect/types/_datetime_deprecations.py +332 -0
  30. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/pydantic.py +2 -1
  31. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/AGENTS.md +2 -2
  32. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/process.py +16 -25
  33. prefect_client-3.8.9.dev7/src/prefect/_build_info.py +0 -5
  34. prefect_client-3.8.9.dev7/src/prefect/runner/runner.py +0 -1891
  35. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/.gitignore +0 -0
  36. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/LICENSE +0 -0
  37. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/README.md +0 -0
  38. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/hatch_build.py +0 -0
  39. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/.prefectignore +0 -0
  40. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/AGENTS.md +0 -0
  41. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/__init__.py +0 -0
  42. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/__main__.py +0 -0
  43. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/__init__.py +0 -0
  44. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/_launchers.py +0 -0
  45. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/bundles/__init__.py +0 -0
  46. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
  47. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/plugins/__init__.py +0 -0
  48. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/plugins/apply.py +0 -0
  49. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  50. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/plugins/manager.py +0 -0
  51. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/plugins/spec.py +0 -0
  52. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
  53. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/sla/client.py +0 -0
  54. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
  55. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_flow_run_suspension.py +0 -0
  56. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/__init__.py +0 -0
  57. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/_logging.py +0 -0
  58. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/_observation_delivery.py +0 -0
  59. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/__init__.py +0 -0
  60. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  61. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/client.py +0 -0
  62. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/device_id.py +0 -0
  63. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/emit.py +0 -0
  64. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/enabled.py +0 -0
  65. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/events.py +0 -0
  66. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/milestones.py +0 -0
  67. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/notice.py +0 -0
  68. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/analytics/service.py +0 -0
  69. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/ast_utils.py +0 -0
  70. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/attempt_control.py +0 -0
  71. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/buildx.py +0 -0
  72. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
  73. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  74. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/compatibility/backports.py +0 -0
  75. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
  76. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  77. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
  78. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/compatibility/starlette.py +0 -0
  79. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
  80. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
  81. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
  82. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  83. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  84. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
  85. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
  86. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
  87. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
  88. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/control_listener.py +0 -0
  89. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/deprecated.py +0 -0
  90. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/engine.py +0 -0
  91. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/git.py +0 -0
  92. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  93. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/installation.py +0 -0
  94. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/integrations.py +0 -0
  95. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/launchers.py +0 -0
  96. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/lazy.py +0 -0
  97. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/metrics.py +0 -0
  98. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/observability.py +0 -0
  99. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/observers.py +0 -0
  100. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/plugins/__init__.py +0 -0
  101. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/plugins/apply.py +0 -0
  102. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/plugins/collections.py +0 -0
  103. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  104. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/plugins/manager.py +0 -0
  105. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/plugins/spec.py +0 -0
  106. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/plugins/startup.py +0 -0
  107. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
  108. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
  109. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  110. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  111. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  112. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/pytz.py +0 -0
  113. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/result_records.py +0 -0
  114. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/retries.py +0 -0
  115. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/schema.py +0 -0
  116. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
  117. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/schemas/_registry.py +0 -0
  118. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
  119. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
  120. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
  121. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
  122. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  123. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/server_maintenance.py +0 -0
  124. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/states.py +0 -0
  125. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/testing.py +0 -0
  126. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/urls.py +0 -0
  127. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/uuid7.py +0 -0
  128. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/version_checking.py +0 -0
  129. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/versioning.py +0 -0
  130. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/waiters.py +0 -0
  131. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_internal/websockets.py +0 -0
  132. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/__init__.py +0 -0
  133. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/fetcher.py +0 -0
  134. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/generator.py +0 -0
  135. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/models.py +0 -0
  136. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/naming.py +0 -0
  137. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/renderer.py +0 -0
  138. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/schema_converter.py +0 -0
  139. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/templates/__init__.py +0 -0
  140. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  141. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/types.py +0 -0
  142. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_sdk/unions.py +0 -0
  143. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
  144. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
  145. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/agent.py +0 -0
  146. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/analytics/__init__.py +0 -0
  147. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/artifacts.py +0 -0
  148. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/assets/__init__.py +0 -0
  149. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/assets/core.py +0 -0
  150. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/assets/materialize.py +0 -0
  151. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/automations.py +0 -0
  152. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/AGENTS.md +0 -0
  153. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/__init__.py +0 -0
  154. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/abstract.py +0 -0
  155. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/core.py +0 -0
  156. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/fields.py +0 -0
  157. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/notifications.py +0 -0
  158. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/redis.py +0 -0
  159. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/system.py +0 -0
  160. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/blocks/webhook.py +0 -0
  161. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/bundles/__init__.py +0 -0
  162. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/bundles/_file_collector.py +0 -0
  163. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/bundles/_ignore_filter.py +0 -0
  164. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/bundles/_path_resolver.py +0 -0
  165. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/bundles/_zip_builder.py +0 -0
  166. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/bundles/_zip_extractor.py +0 -0
  167. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/bundles/execute.py +0 -0
  168. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/cache_policies.py +0 -0
  169. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/AGENTS.md +0 -0
  170. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/__init__.py +0 -0
  171. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/attribution.py +0 -0
  172. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/base.py +0 -0
  173. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/cloud.py +0 -0
  174. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/collections.py +0 -0
  175. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/constants.py +0 -0
  176. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/__init__.py +0 -0
  177. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  178. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  179. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  180. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
  181. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  182. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  183. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  184. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  185. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  186. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  187. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  188. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  189. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  190. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  191. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  192. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_events/client.py +0 -0
  193. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  194. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  195. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  196. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
  197. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  198. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
  199. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  200. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
  201. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  202. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  203. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/base.py +0 -0
  204. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/orchestration/routes.py +0 -0
  205. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/__init__.py +0 -0
  206. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/actions.py +0 -0
  207. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/events.py +0 -0
  208. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/filters.py +0 -0
  209. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/objects.py +0 -0
  210. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/responses.py +0 -0
  211. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/schedules.py +0 -0
  212. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/sorting.py +0 -0
  213. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/schemas/worker_channel.py +0 -0
  214. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/subscriptions.py +0 -0
  215. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/types/__init__.py +0 -0
  216. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  217. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/client/utilities.py +0 -0
  218. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/AGENTS.md +0 -0
  219. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/__init__.py +0 -0
  220. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/_asyncio.py +0 -0
  221. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/_events.py +0 -0
  222. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/_leases.py +0 -0
  223. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/_sync.py +0 -0
  224. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/asyncio.py +0 -0
  225. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/context.py +0 -0
  226. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/services.py +0 -0
  227. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/sync.py +0 -0
  228. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
  229. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  230. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
  231. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
  232. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/v1/context.py +0 -0
  233. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/v1/services.py +0 -0
  234. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
  235. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/context.py +0 -0
  236. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/AGENTS.md +0 -0
  237. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/__init__.py +0 -0
  238. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/base.py +0 -0
  239. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/deployments.py +0 -0
  240. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/flow_runs.py +0 -0
  241. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/schedules.py +0 -0
  242. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
  243. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/steps/core.py +0 -0
  244. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/steps/pull.py +0 -0
  245. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/deployments/steps/utility.py +0 -0
  246. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/docker/__init__.py +0 -0
  247. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/docker/_buildx.py +0 -0
  248. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/docker/docker_image.py +0 -0
  249. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/engine.py +0 -0
  250. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/AGENTS.md +0 -0
  251. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/__init__.py +0 -0
  252. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/actions.py +0 -0
  253. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/clients.py +0 -0
  254. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/filters.py +0 -0
  255. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/related.py +0 -0
  256. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/schemas/__init__.py +0 -0
  257. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  258. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/schemas/events.py +0 -0
  259. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/schemas/labelling.py +0 -0
  260. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/subscribers.py +0 -0
  261. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/utilities.py +0 -0
  262. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/events/worker.py +0 -0
  263. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/exceptions.py +0 -0
  264. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/filesystems.py +0 -0
  265. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/flow_engine.py +0 -0
  266. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/flow_runs.py +0 -0
  267. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/flows.py +0 -0
  268. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/futures.py +0 -0
  269. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/infrastructure/__init__.py +0 -0
  270. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/infrastructure/base.py +0 -0
  271. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  272. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  273. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  274. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  275. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  276. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  277. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/input/__init__.py +0 -0
  278. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/input/actions.py +0 -0
  279. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/input/run_input.py +0 -0
  280. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/locking/__init__.py +0 -0
  281. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/locking/_filelock.py +0 -0
  282. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/locking/filesystem.py +0 -0
  283. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/locking/memory.py +0 -0
  284. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/locking/protocol.py +0 -0
  285. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/__init__.py +0 -0
  286. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/clients.py +0 -0
  287. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/configuration.py +0 -0
  288. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/filters.py +0 -0
  289. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/formatters.py +0 -0
  290. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/highlighters.py +0 -0
  291. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/loggers.py +0 -0
  292. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/logging/logging.yml +0 -0
  293. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/main.py +0 -0
  294. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/plugins.py +0 -0
  295. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/py.typed +0 -0
  296. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/results.py +0 -0
  297. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/__init__.py +0 -0
  298. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_cancel_finalizer.py +0 -0
  299. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_cancellation_manager.py +0 -0
  300. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_control_channel.py +0 -0
  301. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_deployment_registry.py +0 -0
  302. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_event_emitter.py +0 -0
  303. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_flow_resolver.py +0 -0
  304. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_flow_run_executor.py +0 -0
  305. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_hook_runner.py +0 -0
  306. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_limit_manager.py +0 -0
  307. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_state_proposer.py +0 -0
  308. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_uv_command.py +0 -0
  309. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_workspace_hook_runner.py +0 -0
  310. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_workspace_resolver.py +0 -0
  311. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_workspace_runtime.py +0 -0
  312. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_workspace_runtime_bootstrap.py +0 -0
  313. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_workspace_starter.py +0 -0
  314. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/_workspace_supervisor.py +0 -0
  315. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runner/storage.py +0 -0
  316. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runtime/__init__.py +0 -0
  317. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runtime/deployment.py +0 -0
  318. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/runtime/task_run.py +0 -0
  319. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/schedules.py +0 -0
  320. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/serializers.py +0 -0
  321. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/__init__.py +0 -0
  322. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/_ui_static.py +0 -0
  323. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/admin.py +0 -0
  324. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/artifacts.py +0 -0
  325. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/automations.py +0 -0
  326. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/background_workers.py +0 -0
  327. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
  328. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/block_documents.py +0 -0
  329. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/block_schemas.py +0 -0
  330. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/block_types.py +0 -0
  331. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/clients.py +0 -0
  332. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/collections.py +0 -0
  333. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  334. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
  335. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/csrf_token.py +0 -0
  336. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/dependencies.py +0 -0
  337. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/deployments.py +0 -0
  338. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/events.py +0 -0
  339. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
  340. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/flows.py +0 -0
  341. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/logs.py +0 -0
  342. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/middleware.py +0 -0
  343. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/root.py +0 -0
  344. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/run_history.py +0 -0
  345. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/saved_searches.py +0 -0
  346. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/server.py +0 -0
  347. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  348. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/task_run_states.py +0 -0
  349. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/task_runs.py +0 -0
  350. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/task_workers.py +0 -0
  351. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/templates.py +0 -0
  352. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
  353. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
  354. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/validation.py +0 -0
  355. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/variables.py +0 -0
  356. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/work_queues.py +0 -0
  357. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/server/api/workers.py +0 -0
  358. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/AGENTS.md +0 -0
  359. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/__init__.py +0 -0
  360. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/base.py +0 -0
  361. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/constants.py +0 -0
  362. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/context.py +0 -0
  363. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/legacy.py +0 -0
  364. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/__init__.py +0 -0
  365. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/_defaults.py +0 -0
  366. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/api.py +0 -0
  367. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/cli.py +0 -0
  368. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/client.py +0 -0
  369. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/cloud.py +0 -0
  370. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/events.py +0 -0
  371. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/experiments.py +0 -0
  372. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/flows.py +0 -0
  373. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/internal.py +0 -0
  374. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/logging.py +0 -0
  375. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/plugins.py +0 -0
  376. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/results.py +0 -0
  377. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/root.py +0 -0
  378. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/runner.py +0 -0
  379. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
  380. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/api.py +0 -0
  381. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
  382. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/database.py +0 -0
  383. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
  384. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/docket.py +0 -0
  385. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
  386. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/events.py +0 -0
  387. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  388. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/logs.py +0 -0
  389. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/root.py +0 -0
  390. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/services.py +0 -0
  391. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
  392. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/ui.py +0 -0
  393. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/server/worker_channel.py +0 -0
  394. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/tasks.py +0 -0
  395. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/telemetry.py +0 -0
  396. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/testing.py +0 -0
  397. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/models/worker.py +0 -0
  398. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/profiles.py +0 -0
  399. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/profiles.toml +0 -0
  400. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/settings/sources.py +0 -0
  401. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/states.py +0 -0
  402. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/task_engine.py +0 -0
  403. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/task_runners.py +0 -0
  404. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/task_runs.py +0 -0
  405. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/task_worker.py +0 -0
  406. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/telemetry/__init__.py +0 -0
  407. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
  408. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/transactions.py +0 -0
  409. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/types/_concurrency.py +0 -0
  410. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/types/entrypoint.py +0 -0
  411. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/types/names.py +0 -0
  412. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/AGENTS.md +0 -0
  413. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/__init__.py +0 -0
  414. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/annotations.py +0 -0
  415. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  416. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  417. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/callables/AGENTS.md +0 -0
  418. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/callables/__init__.py +0 -0
  419. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/collections.py +0 -0
  420. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/compat.py +0 -0
  421. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/context.py +0 -0
  422. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/dispatch.py +0 -0
  423. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/dockerutils.py +0 -0
  424. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/engine/AGENTS.md +0 -0
  425. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/engine/__init__.py +0 -0
  426. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  427. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/filesystem/__init__.py +0 -0
  428. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/generics.py +0 -0
  429. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/hashing.py +0 -0
  430. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/importtools.py +0 -0
  431. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/math.py +0 -0
  432. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/names.py +0 -0
  433. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  434. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/processutils/__init__.py +0 -0
  435. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/render_swagger.py +0 -0
  436. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  437. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  438. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  439. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
  440. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/services.py +0 -0
  441. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/slugify.py +0 -0
  442. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/templating/AGENTS.md +0 -0
  443. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/templating/__init__.py +0 -0
  444. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/text.py +0 -0
  445. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/timeout.py +0 -0
  446. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/urls.py +0 -0
  447. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/utilities/visualization.py +0 -0
  448. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/variables.py +0 -0
  449. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/__init__.py +0 -0
  450. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/_cleanup.py +0 -0
  451. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/_cleanup_handlers.py +0 -0
  452. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  453. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  454. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/_worker_channel/_state.py +0 -0
  455. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  456. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  457. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/base.py +0 -0
  458. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/block.py +0 -0
  459. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/cloud.py +0 -0
  460. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/src/prefect/workers/server.py +0 -0
  461. {prefect_client-3.8.9.dev7 → prefect_client-3.9.1.dev1}/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.9.dev7
3
+ Version: 3.9.1.dev1
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
@@ -18,17 +18,19 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
20
  Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: 3.15
21
22
  Classifier: Topic :: Software Development :: Libraries
22
- Requires-Python: <3.15,>=3.11
23
+ Requires-Python: <3.16,>=3.11
23
24
  Requires-Dist: amplitude-analytics<2.0.0,>=1.2.1
24
25
  Requires-Dist: anyio<5.0.0,>=4.4.0
25
26
  Requires-Dist: asgi-lifespan<3.0,>=1.0
26
27
  Requires-Dist: cachetools<8.0,>=5.3
28
+ Requires-Dist: certifi>=2026.10.19
27
29
  Requires-Dist: cloudpickle<4.0,>=2.0
28
30
  Requires-Dist: coolname<6.0.0,>=1.0.4
29
31
  Requires-Dist: dateparser<2.0.0,>=1.1.1
30
32
  Requires-Dist: exceptiongroup>=1.0.0
31
- Requires-Dist: fastapi<1.0.0,>=0.139.0
33
+ Requires-Dist: fastapi<0.151,>=0.139.0
32
34
  Requires-Dist: fsspec>=2022.5.0
33
35
  Requires-Dist: graphviz>=0.20.1
34
36
  Requires-Dist: griffe<3.0.0,>=0.49.0
@@ -53,15 +55,14 @@ Requires-Dist: pytz<2027,>=2021.1
53
55
  Requires-Dist: pyyaml<7.0.0,>=5.4.1
54
56
  Requires-Dist: rfc3339-validator<0.2.0,>=0.1.4
55
57
  Requires-Dist: rich<16.0,>=11.0
56
- Requires-Dist: ruamel-yaml-clib>=0.2.8; platform_python_implementation == 'CPython'
57
- Requires-Dist: ruamel-yaml>=0.17.0
58
+ Requires-Dist: ruamel-yaml!=0.19.0,>=0.17.0
58
59
  Requires-Dist: sniffio<2.0.0,>=1.3.0
59
60
  Requires-Dist: starlette>=1.0.1
60
61
  Requires-Dist: toml>=0.10.0
61
62
  Requires-Dist: typing-extensions<5.0.0,>=4.10.0
62
63
  Requires-Dist: uvicorn!=0.29.0,>=0.14.0
63
64
  Requires-Dist: websockets<17.0,>=15.0.1
64
- Requires-Dist: whenever<0.11.0,>=0.7.3; python_version >= '3.13'
65
+ Requires-Dist: whenever<0.11.0,>=0.10.5; python_version >= '3.13'
65
66
  Provides-Extra: notifications
66
67
  Requires-Dist: apprise<2.0.0,>=1.13.0; extra == 'notifications'
67
68
  Description-Content-Type: text/markdown
@@ -7,7 +7,7 @@ name = "prefect-client"
7
7
  dynamic = ["version"]
8
8
  description = "Workflow orchestration and management."
9
9
  readme = "README.md"
10
- requires-python = ">=3.11,<3.15"
10
+ requires-python = ">=3.11,<3.16"
11
11
  license = { text = "Apache-2.0" }
12
12
  authors = [{ name = "Prefect Technologies, Inc.", email = "help@prefect.io" }]
13
13
  classifiers = [
@@ -20,6 +20,7 @@ classifiers = [
20
20
  "Programming Language :: Python :: 3.12",
21
21
  "Programming Language :: Python :: 3.13",
22
22
  "Programming Language :: Python :: 3.14",
23
+ "Programming Language :: Python :: 3.15",
23
24
  "Topic :: Software Development :: Libraries",
24
25
  ]
25
26
  dependencies = [
@@ -28,11 +29,13 @@ dependencies = [
28
29
  "anyio>=4.4.0,<5.0.0",
29
30
  "asgi-lifespan>=1.0,<3.0",
30
31
  "cachetools>=5.3,<8.0",
32
+ "certifi>=2026.10.19",
31
33
  "cloudpickle>=2.0,<4.0",
32
34
  "coolname>=1.0.4,<6.0.0",
33
35
  "dateparser>=1.1.1,<2.0.0",
34
36
  "exceptiongroup>=1.0.0",
35
- "fastapi>=0.139.0,<1.0.0",
37
+ # 0.151 rejects an explicit null for a body param with a default, and released clients send null
38
+ "fastapi>=0.139.0,<0.151",
36
39
  "fsspec>=2022.5.0",
37
40
  "graphviz>=0.20.1",
38
41
  "griffe>=0.49.0,<3.0.0",
@@ -57,15 +60,14 @@ dependencies = [
57
60
  "pyyaml>=5.4.1,<7.0.0",
58
61
  "rfc3339-validator>=0.1.4,<0.2.0",
59
62
  "rich>=11.0,<16.0",
60
- "ruamel.yaml>=0.17.0",
61
- "ruamel.yaml.clib>=0.2.8; platform_python_implementation == 'CPython'",
63
+ "ruamel.yaml>=0.17.0,!=0.19.0",
62
64
  "sniffio>=1.3.0,<2.0.0",
63
65
  "starlette>=1.0.1",
64
66
  "toml>=0.10.0",
65
67
  "typing_extensions>=4.10.0,<5.0.0",
66
68
  "uvicorn>=0.14.0,!=0.29.0",
67
69
  "websockets>=15.0.1,<17.0",
68
- "whenever>=0.7.3,<0.11.0; python_version>='3.13'",
70
+ "whenever>=0.10.5,<0.11.0; python_version>='3.13'",
69
71
  ]
70
72
  [project.urls]
71
73
  Changelog = "https://github.com/PrefectHQ/prefect/releases"
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.9.1.dev1"
3
+ __build_date__ = "2026-10-22 08:19:36.634713+00:00"
4
+ __git_commit__ = "7d1688ff034a89a47c900c0e2951c78ff1979f0d"
5
+ __dirty__ = False
@@ -21,7 +21,7 @@ from typing import TYPE_CHECKING, Any, Callable, Optional, Union
21
21
  from pydantic import BaseModel
22
22
  from typing_extensions import ParamSpec, TypeAlias, TypeVar
23
23
 
24
- from prefect.types._datetime import now
24
+ from prefect.types._datetime import _pendulum_call, now
25
25
  from prefect.utilities.callables import get_call_parameters
26
26
  from prefect.utilities.importtools import (
27
27
  AliasedModuleDefinition,
@@ -96,14 +96,16 @@ def generate_deprecation_message(
96
96
  if hasattr(PlainDateTime, "to_stdlib")
97
97
  else PlainDateTime.from_py_datetime
98
98
  )
99
- _dt = _pdt_from_dt(start_date).add(months=6)
99
+ # PlainDateTime requires a naive datetime; the warning only renders
100
+ # month and year, so any tzinfo on start_date is dropped.
101
+ _dt = _pdt_from_dt(start_date.replace(tzinfo=None)).add(months=6)
100
102
  end_date = (
101
103
  _dt.to_stdlib() if hasattr(_dt, "to_stdlib") else _dt.py_datetime()
102
104
  )
103
105
  else:
104
106
  import pendulum
105
107
 
106
- end_date = pendulum.instance(start_date).add(months=6)
108
+ end_date = _pendulum_call(pendulum.instance(start_date), "add", months=6)
107
109
 
108
110
  if when:
109
111
  when = " when " + when
@@ -27,6 +27,11 @@ R = TypeVar("R", infer_variance=True)
27
27
  # Track all active services for fork handling
28
28
  _active_services: weakref.WeakSet[_QueueServiceBase[Any]] = weakref.WeakSet()
29
29
 
30
+ # Services take items that are already queued without leaving the event loop.
31
+ # Other services share the global loop, so a service working through a backlog
32
+ # yields to them after this many items in a row.
33
+ _READY_ITEMS_PER_YIELD = 256
34
+
30
35
 
31
36
  def _reset_services_after_fork():
32
37
  """
@@ -73,6 +78,7 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
73
78
  self._started: bool = False
74
79
  self._key = hash((self.__class__, *args))
75
80
  self._lock = threading.Lock()
81
+ self._ready_items_since_yield = 0
76
82
  self._queue_get_thread = WorkerThread(
77
83
  # TODO: This thread should not need to be a daemon but when it is not, it
78
84
  # can prevent the interpreter from exiting.
@@ -184,14 +190,37 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
184
190
  assert self._done_event is not None
185
191
  self._done_event.set()
186
192
 
193
+ async def _get_item(self, timeout: Optional[float] = None) -> Optional[T]:
194
+ """
195
+ Take the next item from the queue.
196
+
197
+ An item that is already queued is taken on the event loop. Only an empty
198
+ queue waits on the queue thread, which raises `queue.Empty` if `timeout`
199
+ passes first.
200
+ """
201
+ if self._ready_items_since_yield >= _READY_ITEMS_PER_YIELD:
202
+ self._ready_items_since_yield = 0
203
+ await asyncio.sleep(0)
204
+
205
+ try:
206
+ item = self._queue.get_nowait()
207
+ except queue.Empty:
208
+ pass
209
+ else:
210
+ self._ready_items_since_yield += 1
211
+ return item
212
+
213
+ self._ready_items_since_yield = 0
214
+ return await self._queue_get_thread.submit(
215
+ create_call(self._queue.get, timeout=timeout)
216
+ ).aresult()
217
+
187
218
  async def _main_loop(self) -> None:
188
219
  last_log_time = 0
189
220
  log_interval = 4 # log every 4 seconds
190
221
 
191
222
  while True:
192
- item: Optional[T] = await self._queue_get_thread.submit(
193
- create_call(self._queue.get)
194
- ).aresult()
223
+ item: Optional[T] = await self._get_item()
195
224
 
196
225
  if self._stopped:
197
226
  current_time = asyncio.get_event_loop().time()
@@ -500,9 +529,7 @@ class BatchedQueueService(QueueService[T]):
500
529
  deadline = get_deadline(self.min_interval)
501
530
  while batch_size < self.max_batch_size:
502
531
  try:
503
- item = await self._queue_get_thread.submit(
504
- create_call(self._queue.get, timeout=get_timeout(deadline))
505
- ).aresult()
532
+ item = await self._get_item(timeout=get_timeout(deadline))
506
533
 
507
534
  if item is None:
508
535
  done = True
@@ -35,6 +35,8 @@ import importlib
35
35
  import os
36
36
  import sys
37
37
  import tempfile
38
+ import warnings
39
+ from contextlib import suppress
38
40
  from datetime import datetime, timedelta
39
41
  from pathlib import Path
40
42
  from typing import (
@@ -103,6 +105,7 @@ from prefect.schedules import Schedule
103
105
  from prefect.settings import (
104
106
  PREFECT_DEPLOYMENTS_DEFAULT_WORK_POOL_NAME,
105
107
  PREFECT_UI_URL,
108
+ get_current_settings,
106
109
  )
107
110
  from prefect.types import ListOfNonEmptyStrings
108
111
  from prefect.types.entrypoint import EntrypointType
@@ -125,6 +128,25 @@ if TYPE_CHECKING:
125
128
 
126
129
  __all__ = ["RunnerDeployment"]
127
130
 
131
+
132
+ def _should_clear_empty_schedules() -> bool:
133
+ if get_current_settings().deployments.clear_schedules_on_empty:
134
+ return True
135
+
136
+ warnings.warn(
137
+ "Preserving existing schedules when an empty schedules list is provided "
138
+ "on redeployment is deprecated. A future release will clear schedules "
139
+ "by default after at least six months or three minor releases, whichever "
140
+ "is longer. The opt-in setting and this warning will then be removed. "
141
+ "Set PREFECT_DEPLOYMENTS_CLEAR_SCHEDULES_ON_EMPTY=true to opt in now. "
142
+ "To preserve existing schedules, omit schedules or use schedules=None "
143
+ "(schedules: null in prefect.yaml).",
144
+ FutureWarning,
145
+ stacklevel=3,
146
+ )
147
+ return False
148
+
149
+
128
150
  _DEPLOYMENT_PARAMETER_SERIALIZER = TypeAdapter(
129
151
  dict[str, Any],
130
152
  config=ConfigDict(ser_json_timedelta="float"),
@@ -617,15 +639,21 @@ class RunnerDeployment(BaseModel):
617
639
  deployment_id: UUID,
618
640
  client: PrefectClient,
619
641
  version_info: VersionInfo | None,
642
+ *,
643
+ preserve_schedules: bool = False,
620
644
  ):
621
645
  parameter_openapi_schema = self._parameter_openapi_schema.model_dump(
622
646
  exclude_unset=True
623
647
  )
624
648
 
649
+ exclude = {"storage", "name", "flow_name", "triggers", "version_type"}
650
+ if preserve_schedules:
651
+ # Explicitly set schedules survive exclude_unset, even when empty.
652
+ exclude.add("schedules")
625
653
  update_payload = self.model_dump(
626
654
  mode="json",
627
655
  exclude_unset=True,
628
- exclude={"storage", "name", "flow_name", "triggers", "version_type"},
656
+ exclude=exclude,
629
657
  )
630
658
 
631
659
  if self.storage:
@@ -636,7 +664,7 @@ class RunnerDeployment(BaseModel):
636
664
  else:
637
665
  update_payload["pull_steps"] = None
638
666
 
639
- if self.schedules:
667
+ if self.schedules and not preserve_schedules:
640
668
  update_payload["schedules"] = [
641
669
  schedule.model_dump(mode="json", exclude_unset=True)
642
670
  for schedule in self._schedules_with_serialized_block_parameters() or []
@@ -669,15 +697,21 @@ class RunnerDeployment(BaseModel):
669
697
  deployment_id: UUID,
670
698
  client: SyncPrefectClient,
671
699
  version_info: VersionInfo | None,
700
+ *,
701
+ preserve_schedules: bool = False,
672
702
  ):
673
703
  parameter_openapi_schema = self._parameter_openapi_schema.model_dump(
674
704
  exclude_unset=True
675
705
  )
676
706
 
707
+ exclude = {"storage", "name", "flow_name", "triggers", "version_type"}
708
+ if preserve_schedules:
709
+ # Keep schedule exclusion in sync with _update above.
710
+ exclude.add("schedules")
677
711
  update_payload = self.model_dump(
678
712
  mode="json",
679
713
  exclude_unset=True,
680
- exclude={"storage", "name", "flow_name", "triggers", "version_type"},
714
+ exclude=exclude,
681
715
  )
682
716
 
683
717
  if self.storage:
@@ -688,7 +722,7 @@ class RunnerDeployment(BaseModel):
688
722
  else:
689
723
  update_payload["pull_steps"] = None
690
724
 
691
- if self.schedules:
725
+ if self.schedules and not preserve_schedules:
692
726
  update_payload["schedules"] = [
693
727
  schedule.model_dump(mode="json", exclude_unset=True)
694
728
  for schedule in self._schedules_with_serialized_block_parameters() or []
@@ -756,6 +790,9 @@ class RunnerDeployment(BaseModel):
756
790
  Registers this deployment with the API and returns the deployment's ID.
757
791
 
758
792
  Args:
793
+ schedules: Override the schedules for this deployment. On redeployment,
794
+ an empty list preserves schedules by default and emits a warning.
795
+ Set `PREFECT_DEPLOYMENTS_CLEAR_SCHEDULES_ON_EMPTY=true` to clear them.
759
796
  work_pool_name: The name of the work pool to use for this
760
797
  deployment.
761
798
  image: The registry, name, and tag of the Docker image to
@@ -784,11 +821,29 @@ class RunnerDeployment(BaseModel):
784
821
  self.job_variables["image"] = image
785
822
  if work_pool_name:
786
823
  self.work_pool_name = work_pool_name
787
- if schedules:
824
+ clear_schedules = schedules == [] and _should_clear_empty_schedules()
825
+ if schedules or clear_schedules:
788
826
  self.schedules = [
789
- DeploymentScheduleUpdate(**schedule) for schedule in schedules
827
+ DeploymentScheduleUpdate(**schedule)
828
+ for schedule in schedules or []
790
829
  ]
791
- return await self._update(deployment.id, client, version_info)
830
+ await self._update(
831
+ deployment.id,
832
+ client,
833
+ version_info,
834
+ preserve_schedules=schedules == [] and not clear_schedules,
835
+ )
836
+ # The update API preserves empty-list updates when all existing
837
+ # schedules have slugs. Clear those explicitly after a successful update.
838
+ if clear_schedules and all(
839
+ schedule.slug is not None for schedule in deployment.schedules
840
+ ):
841
+ for schedule in deployment.schedules:
842
+ with suppress(ObjectNotFound):
843
+ await client.delete_deployment_schedule(
844
+ deployment.id, schedule.id
845
+ )
846
+ return deployment.id
792
847
 
793
848
  @async_dispatch(aapply)
794
849
  def apply(
@@ -802,6 +857,9 @@ class RunnerDeployment(BaseModel):
802
857
  Registers this deployment with the API and returns the deployment's ID.
803
858
 
804
859
  Args:
860
+ schedules: Override the schedules for this deployment. On redeployment,
861
+ an empty list preserves schedules by default and emits a warning.
862
+ Set `PREFECT_DEPLOYMENTS_CLEAR_SCHEDULES_ON_EMPTY=true` to clear them.
805
863
  work_pool_name: The name of the work pool to use for this
806
864
  deployment.
807
865
  image: The registry, name, and tag of the Docker image to
@@ -829,11 +887,28 @@ class RunnerDeployment(BaseModel):
829
887
  self.job_variables["image"] = image
830
888
  if work_pool_name:
831
889
  self.work_pool_name = work_pool_name
832
- if schedules:
890
+ clear_schedules = schedules == [] and _should_clear_empty_schedules()
891
+ if schedules or clear_schedules:
833
892
  self.schedules = [
834
- DeploymentScheduleUpdate(**schedule) for schedule in schedules
893
+ DeploymentScheduleUpdate(**schedule)
894
+ for schedule in schedules or []
835
895
  ]
836
- return self._update_sync(deployment.id, client, version_info)
896
+ self._update_sync(
897
+ deployment.id,
898
+ client,
899
+ version_info,
900
+ preserve_schedules=schedules == [] and not clear_schedules,
901
+ )
902
+ # Keep explicit clearing in sync with aapply above.
903
+ if clear_schedules and all(
904
+ schedule.slug is not None for schedule in deployment.schedules
905
+ ):
906
+ for schedule in deployment.schedules:
907
+ with suppress(ObjectNotFound):
908
+ client.delete_deployment_schedule(
909
+ deployment.id, schedule.id
910
+ )
911
+ return deployment.id
837
912
 
838
913
  async def _create_slas(self, deployment_id: UUID, client: PrefectClient):
839
914
  if not isinstance(self._sla, list):
@@ -31,6 +31,7 @@ from typing_extensions import Self, TypeAlias
31
31
 
32
32
  from prefect._internal.schemas.bases import PrefectBaseModel
33
33
  from prefect.events.actions import ActionTypes, ActionTypesOrUnknown, RunDeployment
34
+ from prefect.types import DurationOrSecondsTimeDelta
34
35
  from prefect.utilities.collections import AutoEnum
35
36
 
36
37
  from .events import ResourceSpecification
@@ -200,9 +201,10 @@ class EventTrigger(ResourceTrigger):
200
201
  "triggers)"
201
202
  ),
202
203
  )
203
- within: timedelta = Field(
204
+ within: DurationOrSecondsTimeDelta = Field(
204
205
  default=timedelta(seconds=0),
205
206
  ge=timedelta(seconds=0),
207
+ json_schema_extra={"minimum": 0},
206
208
  description=(
207
209
  "The time period over which the events must occur. For Reactive triggers, "
208
210
  "this may be as low as 0 seconds, but must be at least 10 seconds for "
@@ -305,16 +307,18 @@ class MetricTriggerQuery(PrefectBaseModel):
305
307
  "the query result against the threshold value."
306
308
  ),
307
309
  )
308
- range: timedelta = Field(
310
+ range: DurationOrSecondsTimeDelta = Field(
309
311
  timedelta(seconds=300), # defaults to 5 minutes
312
+ json_schema_extra={"minimum": 300},
310
313
  description=(
311
314
  "The lookback duration (seconds) for a metric query. This duration is "
312
315
  "used to determine the time range over which the query will be executed. "
313
316
  "The minimum value is 300 seconds (5 minutes)."
314
317
  ),
315
318
  )
316
- firing_for: timedelta = Field(
319
+ firing_for: DurationOrSecondsTimeDelta = Field(
317
320
  timedelta(seconds=300), # defaults to 5 minutes
321
+ json_schema_extra={"minimum": 300},
318
322
  description=(
319
323
  "The duration (seconds) for which the metric query must breach "
320
324
  "or resolve continuously before the state is updated and the "
@@ -367,7 +371,7 @@ class CompositeTrigger(Trigger, abc.ABC):
367
371
 
368
372
  type: Literal["compound", "sequence"]
369
373
  triggers: List["TriggerTypes"]
370
- within: Optional[timedelta] = Field(
374
+ within: Optional[DurationOrSecondsTimeDelta] = Field(
371
375
  None,
372
376
  description=(
373
377
  "The time period over which the events must occur. For Reactive triggers, "
@@ -41,7 +41,8 @@ Key invariants:
41
41
 
42
42
  `APILogWorker` is a **singleton per unique settings tuple** `(BATCH_SIZE, API_URL, MAX_LOG_SIZE)`. A new settings combination creates a new worker instance.
43
43
 
44
- - `max_batch_size = max(BATCH_SIZE - MAX_LOG_SIZE, MAX_LOG_SIZE)` — defensive: ensures a single max-size log can always fit
44
+ - `max_batch_size = max(BATCH_SIZE - MAX_LOG_SIZE - 1, 1)` — a batch stops taking logs at this size, which leaves room for one more max-size log and the request body's opening bracket. Requests stay within `BATCH_SIZE` whenever `BATCH_SIZE >= MAX_LOG_SIZE + 2`; below that, each request holds one log.
45
+ - `APILogWorker.send()` serializes each log dict to compact JSON (orjson) right away, dropping the `__payload_size__` key that `prepare()` adds. The queue holds only those bytes, and `_handle_batch` posts them joined, without serializing again. Changes to a dict after `send()` are not sent. Process-pool workers still forward dicts through `_api_log_sink`; the parent serializes them when it calls `send()`.
45
46
  - `APILogHandler.prepare()` truncates oversized logs with a buffer; `WorkerAPILogHandler.prepare()` raises `ValueError` instead (no truncation)
46
47
 
47
48
  **Flush deadlock guard:** `APILogHandler.flush()` detects if called from within an event loop and avoids blocking via `from_sync.call_soon_in_new_thread()`. Do not call `flush()` synchronously from async code without this guard.
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import inspect
4
- import json
5
4
  import logging
6
5
  import sys
7
6
  import time
@@ -11,6 +10,7 @@ import warnings
11
10
  from contextlib import asynccontextmanager
12
11
  from typing import TYPE_CHECKING, Any, Callable, Dict, TextIO, Type, cast
13
12
 
13
+ import orjson
14
14
  from rich.console import Console
15
15
  from rich.highlighter import Highlighter, NullHighlighter
16
16
  from rich.theme import Theme
@@ -64,22 +64,51 @@ def emit_api_log(log: Dict[str, Any]) -> None:
64
64
  APILogWorker.instance().send(log)
65
65
 
66
66
 
67
- class APILogWorker(BatchedQueueService[Dict[str, Any]]):
67
+ class APILogWorker(BatchedQueueService[bytes]):
68
68
  @property
69
69
  def max_batch_size(self) -> int:
70
+ # A batch takes logs until it reaches this size, and the last log it takes
71
+ # can be a maximum size log. Leave room for that log and for the opening
72
+ # bracket of the request body, so the request fits in the configured
73
+ # batch size. A batch always takes at least one log.
70
74
  return max(
71
75
  PREFECT_LOGGING_TO_API_BATCH_SIZE.value()
72
- - PREFECT_LOGGING_TO_API_MAX_LOG_SIZE.value(),
73
- PREFECT_LOGGING_TO_API_MAX_LOG_SIZE.value(),
76
+ - PREFECT_LOGGING_TO_API_MAX_LOG_SIZE.value()
77
+ - 1,
78
+ 1,
74
79
  )
75
80
 
76
81
  @property
77
82
  def min_interval(self) -> float | None:
78
83
  return PREFECT_LOGGING_TO_API_BATCH_INTERVAL.value()
79
84
 
80
- async def _handle_batch(self, items: list[dict[str, Any]]):
85
+ def send(self, item: Dict[str, Any] | bytes) -> None:
86
+ """
87
+ Queue a log to send to the API.
88
+
89
+ Accepts a `LogCreate`-compatible dict, such as one returned by
90
+ `APILogHandler.prepare`, or its serialized JSON. Logs are queued as JSON
91
+ so each one is held once and is not serialized again when its batch is
92
+ sent.
93
+ """
94
+ if isinstance(item, dict):
95
+ payload = orjson.dumps(
96
+ {key: value for key, value in item.items() if key != "__payload_size__"}
97
+ )
98
+ # orjson output can take far more memory than its length, about 1 KiB
99
+ # for a short log. Copy it so a backlog of queued logs holds only the
100
+ # JSON.
101
+ item = memoryview(payload).tobytes()
102
+ super().send(item)
103
+
104
+ async def _handle_batch(self, items: list[bytes]):
81
105
  try:
82
- await self._client.create_logs(items)
106
+ await self._client.request(
107
+ "POST",
108
+ "/logs/",
109
+ content=b"[" + b",".join(items) + b"]",
110
+ headers={"Content-Type": "application/json"},
111
+ )
83
112
  except Exception as e:
84
113
  # Roughly replicate the behavior of the stdlib logger error handling
85
114
  if logging.raiseExceptions and sys.stderr:
@@ -106,8 +135,10 @@ class APILogWorker(BatchedQueueService[Dict[str, Any]]):
106
135
  # Ensure a unique worker is retrieved per relevant logging settings
107
136
  return super().instance(*settings, *args)
108
137
 
109
- def _get_size(self, item: Dict[str, Any]) -> int:
110
- return item.pop("__payload_size__", None) or len(json.dumps(item).encode())
138
+ def _get_size(self, item: bytes) -> int:
139
+ # Count the comma or closing bracket that follows each log in the request
140
+ # body, so a full batch stays within the configured batch size
141
+ return len(item) + 1
111
142
 
112
143
 
113
144
  class APILogHandler(logging.Handler):
@@ -286,7 +317,7 @@ class APILogHandler(logging.Handler):
286
317
  return log
287
318
 
288
319
  def _get_payload_size(self, log: Dict[str, Any]) -> int:
289
- return len(json.dumps(log).encode())
320
+ return len(orjson.dumps(log))
290
321
 
291
322
 
292
323
  class WorkerAPILogHandler(APILogHandler):
@@ -35,17 +35,7 @@ Thin facade over single-responsibility extracted classes. New behavior belongs i
35
35
  - Cancellation -> CancellationManager
36
36
  - Hooks -> HookRunner
37
37
 
38
- **Legacy methods on Runner exist only for backward compatibility.** Do not add new behavior to:
39
- - `_submit_run_and_capture_errors()` -- replaced by FlowRunExecutor.submit()
40
- - `_run_process()` -- replaced by ProcessStarter implementations
41
- - `_flow_run_process_map` dict -- replaced by ProcessManager
42
- - `_kill_process()` -- replaced by ProcessManager.kill()
43
- - `_run_on_crashed_hooks()` / `_run_on_cancellation_hooks()` -- replaced by HookRunner
44
- - `execute_flow_run()` -- deprecated (Mar 2026); use `FlowRunExecutorContext` + `WorkspaceResolvingEngineCommandStarter`
45
- - `execute_bundle()` -- deprecated (Mar 2026); use `execute_bundle()` from `prefect.bundles.execute`
46
- - `reschedule_current_flow_runs()` -- deprecated (Mar 2026); SIGTERM rescheduling is now handled inline by the CLI execute path
47
-
48
- These will be removed once internal callers are migrated. Direct ProcessWorker flow runs already use `FlowRunExecutorContext`; generated commands use `WorkspaceResolvingEngineCommandStarter`, while explicitly configured commands use `EngineCommandStarter`. Only the ad hoc bundle path still calls deprecated `Runner.execute_bundle()`. Keep lifecycle behavior in the extracted classes and do not route direct worker execution back through Runner.
38
+ **Runner has no execution path of its own.** Served runs go through `ScheduledRunPoller` -> `FlowRunExecutor`; one-shot callers (workers, `prefect flow-run execute`, `prefect.bundles.execute`) use `FlowRunExecutorContext` with a `ProcessStarter`. `Runner.execute_flow_run()`, `Runner.execute_bundle()` and `Runner.reschedule_current_flow_runs()` were removed after their deprecation period, along with the facade's own process map and kill/hook helpers. Do not reintroduce a second execution or process-tracking path on Runner: `Runner._cancel_run()` only delegates to `CancellationManager` for runs tracked by `ProcessManager`.
49
39
 
50
40
  ## Webserver Health Check
51
41
 
@@ -103,8 +93,9 @@ Each execution mode has a ProcessStarter implementation. To add a new execution
103
93
 
104
94
  `ScheduledRunPoller` now calls `propose_pending` (Scheduled → Pending) before handing off to `FlowRunExecutor`. `FlowRunExecutor` then calls `propose_submitting` (Pending → Submitting sub-state) as step 1 of its lifecycle **when `propose_submitting=True` (the default)**. These are two separate transitions — do not collapse them. The split exists so automations listening for the Pending state fire correctly before the executor begins.
105
95
 
106
- **Three callers set `propose_submitting=False`** via `FlowRunExecutorContext.create_executor(propose_submitting=False)` — all have already advanced the flow run past the Pending state, so proposing Submitting again would be wrong:
96
+ **Four callers set `propose_submitting=False`** via `FlowRunExecutorContext.create_executor(propose_submitting=False)` — all have already advanced the flow run past the Pending state, so proposing Submitting again would be wrong:
107
97
  - direct `ProcessWorker.run()` execution (`BaseWorker` already proposed Submitting)
98
+ - ad hoc `ProcessWorker._submit_adhoc_run()` execution (the worker created or reset the run as Pending)
108
99
  - `prefect flow-run execute` CLI path (invoked by a worker)
109
100
  - `execute_bundle()` in `prefect.bundles.execute` (invoked by bundle dispatch)
110
101
 
@@ -112,7 +103,7 @@ The cancelling precheck (step 1a) still runs unconditionally even when `propose_
112
103
 
113
104
  ## ProcessWorker Execution Paths
114
105
 
115
- Direct ProcessWorker runs use `FlowRunExecutorContext` with `propose_submitting=False`. Generated commands use `WorkspaceResolvingEngineCommandStarter` so command selection follows workspace preparation; explicitly configured commands use `EngineCommandStarter` and retain their own pull-step semantics. The executor owns process tracking, cancellation, Attempt Control Session evidence, crash inference, and normalized infrastructure status. Ad hoc ProcessWorker submissions still call deprecated `Runner.execute_bundle()` and remain a migration target.
106
+ Direct ProcessWorker runs use `FlowRunExecutorContext` with `propose_submitting=False`. Generated commands use `WorkspaceResolvingEngineCommandStarter` so command selection follows workspace preparation; explicitly configured commands use `EngineCommandStarter` and retain their own pull-step semantics. Ad hoc submissions (`_submit_adhoc_run`, used by `InfrastructureBoundFlow`) open their own `FlowRunExecutorContext` with `BundleExecutionStarter` and `propose_submitting=False`, passing the job configuration's `working_dir` and `env`. The executor owns process tracking, cancellation, Attempt Control Session evidence, crash inference, and normalized infrastructure status in every path.
116
107
 
117
108
  ## BlockStorageAdapter Pull Behavior
118
109
 
@@ -368,6 +368,15 @@ class ProcessManager:
368
368
  """
369
369
  return set(self._process_map.keys())
370
370
 
371
+ def flow_run_count(self) -> int:
372
+ """Return the number of tracked flow runs.
373
+
374
+ Reads the map's length without iterating it, so callers on another
375
+ thread, such as the runner webserver, cannot fail while runs are added
376
+ or removed.
377
+ """
378
+ return len(self._process_map)
379
+
371
380
  async def wait_for_exit(self, flow_run_id: UUID, grace_seconds: float = 30) -> bool:
372
381
  """Wait for a tracked process to exit without sending a signal.
373
382
 
@@ -173,8 +173,7 @@ class ScheduledRunPoller:
173
173
  starter = self._resolve_starter(flow_run)
174
174
 
175
175
  # Adhoc storage pull: if the deployment has storage with a
176
- # pull_interval, pull code before starting the process (mirrors
177
- # original Runner._run_process adhoc pull logic).
176
+ # pull_interval, pull code before starting the process.
178
177
  storage = (
179
178
  self._deployment_registry.get_storage(flow_run.deployment_id)
180
179
  if flow_run.deployment_id
@@ -18,7 +18,6 @@ if TYPE_CHECKING:
18
18
  class BundleExecutionStarter:
19
19
  """Executes a pre-serialized bundle in a subprocess via `SpawnProcess`.
20
20
 
21
- Source: runner.py lines 771-841.
22
21
  Uses module-level `execute_bundle_in_subprocess` reference -- patch the
23
22
  module to override.
24
23
 
@@ -17,7 +17,6 @@ if TYPE_CHECKING:
17
17
  class DirectSubprocessStarter:
18
18
  """Runs a flow object directly in a subprocess via `run_flow_in_subprocess`.
19
19
 
20
- Source: runner.py lines 874-889.
21
20
  Uses module-level `run_flow_in_subprocess` reference -- patch the module
22
21
  to override.
23
22
  """