prefect-client 3.9.1.dev7__tar.gz → 3.9.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/PKG-INFO +3 -3
  2. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/README.md +2 -2
  3. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/AGENTS.md +2 -1
  4. prefect_client-3.9.2/src/prefect/_build_info.py +5 -0
  5. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/engine.py +59 -0
  6. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/objects.py +2 -2
  7. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/AGENTS.md +1 -1
  8. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/_leases.py +64 -8
  9. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/runner.py +4 -4
  10. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/filesystems.py +8 -2
  11. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/flow_engine.py +65 -25
  12. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/flow_runs.py +14 -1
  13. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/flows.py +46 -16
  14. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/coiled.py +1 -1
  15. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/modal.py +1 -1
  16. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/input/actions.py +3 -2
  17. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/locking/filesystem.py +9 -4
  18. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/locking/memory.py +10 -5
  19. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/locking/protocol.py +6 -0
  20. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/AGENTS.md +2 -0
  21. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_flow_run_executor.py +42 -16
  22. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_hook_runner.py +4 -5
  23. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_workspace_resolver.py +4 -0
  24. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_workspace_runtime_bootstrap.py +48 -8
  25. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/storage.py +18 -3
  26. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/deployments.py +11 -2
  27. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/flow_runs.py +21 -9
  28. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/server.py +64 -7
  29. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/work_queues.py +34 -13
  30. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/workers.py +64 -17
  31. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/task_runners.py +10 -1
  32. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/types/_datetime.py +4 -1
  33. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/callables/__init__.py +6 -3
  34. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/collections.py +28 -7
  35. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/importtools.py +10 -2
  36. prefect_client-3.9.1.dev7/src/prefect/_build_info.py +0 -5
  37. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/.gitignore +0 -0
  38. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/LICENSE +0 -0
  39. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/hatch_build.py +0 -0
  40. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/pyproject.toml +0 -0
  41. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/.prefectignore +0 -0
  42. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/__init__.py +0 -0
  43. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/__main__.py +0 -0
  44. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/__init__.py +0 -0
  45. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/_launchers.py +0 -0
  46. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/bundles/__init__.py +0 -0
  47. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/bundles/execute.py +0 -0
  48. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/__init__.py +0 -0
  49. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/apply.py +0 -0
  50. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  51. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/manager.py +0 -0
  52. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/spec.py +0 -0
  53. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/sla/__init__.py +0 -0
  54. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/sla/client.py +0 -0
  55. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_experimental/sla/objects.py +0 -0
  56. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_flow_run_suspension.py +0 -0
  57. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/__init__.py +0 -0
  58. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/_logging.py +0 -0
  59. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/_observation_delivery.py +0 -0
  60. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/__init__.py +0 -0
  61. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  62. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/client.py +0 -0
  63. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/device_id.py +0 -0
  64. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/emit.py +0 -0
  65. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/enabled.py +0 -0
  66. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/events.py +0 -0
  67. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/milestones.py +0 -0
  68. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/notice.py +0 -0
  69. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/analytics/service.py +0 -0
  70. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/ast_utils.py +0 -0
  71. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/attempt_control.py +0 -0
  72. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/buildx.py +0 -0
  73. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/__init__.py +0 -0
  74. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  75. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/backports.py +0 -0
  76. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/blocks.py +0 -0
  77. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  78. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  79. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/migration.py +0 -0
  80. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/starlette.py +0 -0
  81. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/__init__.py +0 -0
  82. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/api.py +0 -0
  83. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/calls.py +0 -0
  84. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  85. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  86. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/inspection.py +0 -0
  87. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/primitives.py +0 -0
  88. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/services.py +0 -0
  89. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/threads.py +0 -0
  90. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/waiters.py +0 -0
  91. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/control_listener.py +0 -0
  92. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/deprecated.py +0 -0
  93. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/git.py +0 -0
  94. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  95. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/installation.py +0 -0
  96. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/integrations.py +0 -0
  97. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/launchers.py +0 -0
  98. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/lazy.py +0 -0
  99. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/metrics.py +0 -0
  100. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/observability.py +0 -0
  101. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/observers.py +0 -0
  102. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/plugins/__init__.py +0 -0
  103. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/plugins/apply.py +0 -0
  104. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/plugins/collections.py +0 -0
  105. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  106. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/plugins/manager.py +0 -0
  107. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/plugins/spec.py +0 -0
  108. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/plugins/startup.py +0 -0
  109. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/__init__.py +0 -0
  110. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/schemas.py +0 -0
  111. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  112. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  113. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  114. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/pytz.py +0 -0
  115. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/result_records.py +0 -0
  116. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/retries.py +0 -0
  117. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/schema.py +0 -0
  118. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/schemas/__init__.py +0 -0
  119. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/schemas/_registry.py +0 -0
  120. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/schemas/bases.py +0 -0
  121. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/schemas/fields.py +0 -0
  122. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/schemas/serializers.py +0 -0
  123. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/schemas/validators.py +0 -0
  124. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  125. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/server_maintenance.py +0 -0
  126. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/states.py +0 -0
  127. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/testing.py +0 -0
  128. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/urls.py +0 -0
  129. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/uuid7.py +0 -0
  130. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/version_checking.py +0 -0
  131. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/versioning.py +0 -0
  132. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/waiters.py +0 -0
  133. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_internal/websockets.py +0 -0
  134. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/__init__.py +0 -0
  135. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/fetcher.py +0 -0
  136. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/generator.py +0 -0
  137. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/models.py +0 -0
  138. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/naming.py +0 -0
  139. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/renderer.py +0 -0
  140. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/schema_converter.py +0 -0
  141. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/templates/__init__.py +0 -0
  142. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  143. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/types.py +0 -0
  144. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_sdk/unions.py +0 -0
  145. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_vendor/croniter/__init__.py +0 -0
  146. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/_vendor/croniter/croniter.py +0 -0
  147. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/agent.py +0 -0
  148. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/analytics/__init__.py +0 -0
  149. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/artifacts.py +0 -0
  150. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/assets/__init__.py +0 -0
  151. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/assets/core.py +0 -0
  152. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/assets/materialize.py +0 -0
  153. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/automations.py +0 -0
  154. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/AGENTS.md +0 -0
  155. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/__init__.py +0 -0
  156. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/abstract.py +0 -0
  157. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/core.py +0 -0
  158. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/fields.py +0 -0
  159. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/notifications.py +0 -0
  160. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/redis.py +0 -0
  161. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/system.py +0 -0
  162. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/blocks/webhook.py +0 -0
  163. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/bundles/__init__.py +0 -0
  164. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/bundles/_file_collector.py +0 -0
  165. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/bundles/_ignore_filter.py +0 -0
  166. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/bundles/_path_resolver.py +0 -0
  167. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/bundles/_zip_builder.py +0 -0
  168. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/bundles/_zip_extractor.py +0 -0
  169. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/bundles/execute.py +0 -0
  170. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/cache_policies.py +0 -0
  171. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/AGENTS.md +0 -0
  172. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/__init__.py +0 -0
  173. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/attribution.py +0 -0
  174. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/base.py +0 -0
  175. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/cloud.py +0 -0
  176. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/collections.py +0 -0
  177. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/constants.py +0 -0
  178. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/__init__.py +0 -0
  179. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  180. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  181. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  182. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_automations/client.py +0 -0
  183. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  184. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  185. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  186. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  187. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  188. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  189. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  190. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  191. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  192. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  193. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  194. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_events/client.py +0 -0
  195. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  196. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  197. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  198. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_flows/client.py +0 -0
  199. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  200. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_logs/client.py +0 -0
  201. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  202. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_variables/client.py +0 -0
  203. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  204. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  205. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/base.py +0 -0
  206. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/orchestration/routes.py +0 -0
  207. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/__init__.py +0 -0
  208. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/actions.py +0 -0
  209. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/events.py +0 -0
  210. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/filters.py +0 -0
  211. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/responses.py +0 -0
  212. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/schedules.py +0 -0
  213. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/sorting.py +0 -0
  214. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/schemas/worker_channel.py +0 -0
  215. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/subscriptions.py +0 -0
  216. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/types/__init__.py +0 -0
  217. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  218. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/client/utilities.py +0 -0
  219. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/__init__.py +0 -0
  220. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/_asyncio.py +0 -0
  221. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/_events.py +0 -0
  222. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/_sync.py +0 -0
  223. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/asyncio.py +0 -0
  224. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/context.py +0 -0
  225. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/services.py +0 -0
  226. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/sync.py +0 -0
  227. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/v1/__init__.py +0 -0
  228. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  229. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/v1/_events.py +0 -0
  230. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/v1/asyncio.py +0 -0
  231. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/v1/context.py +0 -0
  232. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/v1/services.py +0 -0
  233. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/concurrency/v1/sync.py +0 -0
  234. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/context.py +0 -0
  235. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/AGENTS.md +0 -0
  236. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/__init__.py +0 -0
  237. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/base.py +0 -0
  238. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/deployments.py +0 -0
  239. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/flow_runs.py +0 -0
  240. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/schedules.py +0 -0
  241. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/steps/__init__.py +0 -0
  242. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/steps/core.py +0 -0
  243. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/steps/pull.py +0 -0
  244. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/deployments/steps/utility.py +0 -0
  245. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/docker/__init__.py +0 -0
  246. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/docker/_buildx.py +0 -0
  247. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/docker/docker_image.py +0 -0
  248. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/engine.py +0 -0
  249. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/AGENTS.md +0 -0
  250. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/__init__.py +0 -0
  251. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/actions.py +0 -0
  252. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/clients.py +0 -0
  253. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/filters.py +0 -0
  254. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/related.py +0 -0
  255. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/schemas/__init__.py +0 -0
  256. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/schemas/automations.py +0 -0
  257. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  258. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/schemas/events.py +0 -0
  259. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/schemas/labelling.py +0 -0
  260. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/subscribers.py +0 -0
  261. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/utilities.py +0 -0
  262. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/events/worker.py +0 -0
  263. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/exceptions.py +0 -0
  264. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/futures.py +0 -0
  265. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/infrastructure/__init__.py +0 -0
  266. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/infrastructure/base.py +0 -0
  267. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  268. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  269. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  270. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  271. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/input/__init__.py +0 -0
  272. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/input/run_input.py +0 -0
  273. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/locking/__init__.py +0 -0
  274. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/locking/_filelock.py +0 -0
  275. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/AGENTS.md +0 -0
  276. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/__init__.py +0 -0
  277. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/clients.py +0 -0
  278. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/configuration.py +0 -0
  279. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/filters.py +0 -0
  280. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/formatters.py +0 -0
  281. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/handlers.py +0 -0
  282. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/highlighters.py +0 -0
  283. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/loggers.py +0 -0
  284. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/logging/logging.yml +0 -0
  285. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/main.py +0 -0
  286. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/plugins.py +0 -0
  287. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/py.typed +0 -0
  288. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/results.py +0 -0
  289. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/__init__.py +0 -0
  290. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_cancel_finalizer.py +0 -0
  291. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_cancellation_manager.py +0 -0
  292. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_control_channel.py +0 -0
  293. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_deployment_registry.py +0 -0
  294. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_event_emitter.py +0 -0
  295. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_flow_resolver.py +0 -0
  296. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_limit_manager.py +0 -0
  297. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_process_manager.py +0 -0
  298. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  299. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_starter_bundle.py +0 -0
  300. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_starter_direct.py +0 -0
  301. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_starter_engine.py +0 -0
  302. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_state_proposer.py +0 -0
  303. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_uv_command.py +0 -0
  304. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_workspace_hook_runner.py +0 -0
  305. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_workspace_runtime.py +0 -0
  306. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_workspace_starter.py +0 -0
  307. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/_workspace_supervisor.py +0 -0
  308. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/runner.py +0 -0
  309. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runner/server.py +0 -0
  310. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runtime/__init__.py +0 -0
  311. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runtime/deployment.py +0 -0
  312. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runtime/flow_run.py +0 -0
  313. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/runtime/task_run.py +0 -0
  314. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/schedules.py +0 -0
  315. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/serializers.py +0 -0
  316. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/__init__.py +0 -0
  317. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/_ui_static.py +0 -0
  318. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/admin.py +0 -0
  319. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/artifacts.py +0 -0
  320. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/automations.py +0 -0
  321. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/background_workers.py +0 -0
  322. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/block_capabilities.py +0 -0
  323. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/block_documents.py +0 -0
  324. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/block_schemas.py +0 -0
  325. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/block_types.py +0 -0
  326. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/clients.py +0 -0
  327. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/collections.py +0 -0
  328. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  329. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/concurrency_limits.py +0 -0
  330. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  331. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/csrf_token.py +0 -0
  332. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/dependencies.py +0 -0
  333. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/events.py +0 -0
  334. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/flow_run_states.py +0 -0
  335. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/flows.py +0 -0
  336. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/logs.py +0 -0
  337. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/middleware.py +0 -0
  338. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/observed_states.py +0 -0
  339. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/root.py +0 -0
  340. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/run_history.py +0 -0
  341. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/saved_searches.py +0 -0
  342. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  343. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/task_run_states.py +0 -0
  344. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/task_runs.py +0 -0
  345. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/task_workers.py +0 -0
  346. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/templates.py +0 -0
  347. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/ui/__init__.py +0 -0
  348. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/ui/flow_runs.py +0 -0
  349. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/ui/flows.py +0 -0
  350. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/ui/schemas.py +0 -0
  351. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/ui/task_runs.py +0 -0
  352. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/validation.py +0 -0
  353. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/server/api/variables.py +0 -0
  354. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/AGENTS.md +0 -0
  355. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/__init__.py +0 -0
  356. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/_types.py +0 -0
  357. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/base.py +0 -0
  358. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/constants.py +0 -0
  359. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/context.py +0 -0
  360. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/legacy.py +0 -0
  361. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/__init__.py +0 -0
  362. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/_defaults.py +0 -0
  363. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/api.py +0 -0
  364. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/cli.py +0 -0
  365. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/client.py +0 -0
  366. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/cloud.py +0 -0
  367. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/deployments.py +0 -0
  368. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/events.py +0 -0
  369. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/experiments.py +0 -0
  370. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/flows.py +0 -0
  371. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/internal.py +0 -0
  372. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/logging.py +0 -0
  373. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/plugins.py +0 -0
  374. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/results.py +0 -0
  375. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/root.py +0 -0
  376. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/runner.py +0 -0
  377. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/__init__.py +0 -0
  378. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/api.py +0 -0
  379. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/concurrency.py +0 -0
  380. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/database.py +0 -0
  381. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/deployments.py +0 -0
  382. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/docket.py +0 -0
  383. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/ephemeral.py +0 -0
  384. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/events.py +0 -0
  385. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  386. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/logs.py +0 -0
  387. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/root.py +0 -0
  388. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/services.py +0 -0
  389. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/tasks.py +0 -0
  390. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/ui.py +0 -0
  391. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/server/worker_channel.py +0 -0
  392. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/tasks.py +0 -0
  393. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/telemetry.py +0 -0
  394. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/testing.py +0 -0
  395. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/models/worker.py +0 -0
  396. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/profiles.py +0 -0
  397. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/profiles.toml +0 -0
  398. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/settings/sources.py +0 -0
  399. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/states.py +0 -0
  400. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/task_engine.py +0 -0
  401. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/task_runs.py +0 -0
  402. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/task_worker.py +0 -0
  403. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/tasks.py +0 -0
  404. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/telemetry/__init__.py +0 -0
  405. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/telemetry/run_telemetry.py +0 -0
  406. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/transactions.py +0 -0
  407. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/types/__init__.py +0 -0
  408. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/types/_concurrency.py +0 -0
  409. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/types/_datetime_deprecations.py +0 -0
  410. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/types/entrypoint.py +0 -0
  411. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/types/names.py +0 -0
  412. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/AGENTS.md +0 -0
  413. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/__init__.py +0 -0
  414. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/annotations.py +0 -0
  415. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  416. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  417. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/callables/AGENTS.md +0 -0
  418. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/compat.py +0 -0
  419. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/context.py +0 -0
  420. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/dispatch.py +0 -0
  421. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/dockerutils.py +0 -0
  422. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/engine/AGENTS.md +0 -0
  423. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/engine/__init__.py +0 -0
  424. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  425. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/filesystem/__init__.py +0 -0
  426. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/generics.py +0 -0
  427. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/hashing.py +0 -0
  428. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/math.py +0 -0
  429. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/names.py +0 -0
  430. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  431. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/processutils/__init__.py +0 -0
  432. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/pydantic.py +0 -0
  433. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/render_swagger.py +0 -0
  434. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  435. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  436. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  437. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/schema_tools/validation.py +0 -0
  438. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/services.py +0 -0
  439. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/slugify.py +0 -0
  440. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/templating/AGENTS.md +0 -0
  441. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/templating/__init__.py +0 -0
  442. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/text.py +0 -0
  443. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/timeout.py +0 -0
  444. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/urls.py +0 -0
  445. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/utilities/visualization.py +0 -0
  446. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/variables.py +0 -0
  447. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/AGENTS.md +0 -0
  448. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/__init__.py +0 -0
  449. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/_cleanup.py +0 -0
  450. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/_cleanup_handlers.py +0 -0
  451. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  452. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  453. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/_state.py +0 -0
  454. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  455. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  456. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/base.py +0 -0
  457. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/block.py +0 -0
  458. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/cloud.py +0 -0
  459. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/process.py +0 -0
  460. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/src/prefect/workers/server.py +0 -0
  461. {prefect_client-3.9.1.dev7 → prefect_client-3.9.2}/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.9.1.dev7
3
+ Version: 3.9.2
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://www.prefect.io/docs
@@ -163,7 +163,7 @@ describing the functionality you are interested in using and we will do our best
163
163
  ## Next steps
164
164
 
165
165
  There's lots more you can do to orchestrate and observe your workflows with Prefect!
166
- Start with our [friendly tutorial](https://www.prefect.io/docs/tutorials) or explore the [core concepts of Prefect workflows](https://www.prefect.io/docs/concepts/).
166
+ Start with our [friendly tutorial](https://www.prefect.io/docs/v3/get-started/quickstart) or explore the [core concepts of Prefect workflows](https://www.prefect.io/docs/concepts/).
167
167
 
168
168
  ## Join the community
169
169
 
@@ -173,6 +173,6 @@ All community forums, including code contributions, issue discussions, and Slack
173
173
 
174
174
  ## Contribute
175
175
 
176
- See our [documentation on contributing to Prefect](https://www.prefect.io/docs/contributing/overview/).
176
+ See our [documentation on contributing to Prefect](https://www.prefect.io/docs/contribute).
177
177
 
178
178
  Thanks for being part of the mission to build a new kind of workflow system and, of course, **happy engineering!**
@@ -94,7 +94,7 @@ describing the functionality you are interested in using and we will do our best
94
94
  ## Next steps
95
95
 
96
96
  There's lots more you can do to orchestrate and observe your workflows with Prefect!
97
- Start with our [friendly tutorial](https://www.prefect.io/docs/tutorials) or explore the [core concepts of Prefect workflows](https://www.prefect.io/docs/concepts/).
97
+ Start with our [friendly tutorial](https://www.prefect.io/docs/v3/get-started/quickstart) or explore the [core concepts of Prefect workflows](https://www.prefect.io/docs/concepts/).
98
98
 
99
99
  ## Join the community
100
100
 
@@ -104,6 +104,6 @@ All community forums, including code contributions, issue discussions, and Slack
104
104
 
105
105
  ## Contribute
106
106
 
107
- See our [documentation on contributing to Prefect](https://www.prefect.io/docs/contributing/overview/).
107
+ See our [documentation on contributing to Prefect](https://www.prefect.io/docs/contribute).
108
108
 
109
109
  Thanks for being part of the mission to build a new kind of workflow system and, of course, **happy engineering!**
@@ -29,7 +29,7 @@ Runtime flow/task parameter values must come from `utilities.callables.get_call_
29
29
  - **Sync and async must stay in sync.** Both `flow_engine.py` and `task_engine.py` have sync and async paths. Any behavior change must be applied to both.
30
30
  - **Event and log WebSocket subscribers are parallel implementations.** `events/clients.py::PrefectEventSubscriber` and `logging/clients.py::PrefectLogsSubscriber` duplicate the same reconnect/backoff/dedup logic, including the `reconnect_on_clean_close` option (used by `events/subscribers.py::FlowRunSubscriber` so a clean disconnect doesn't hide a terminal event). Mirror any reconnection-behavior change across both.
31
31
  - **Flow run observers own their stream recovery.** `_internal/observers.py` observers create subscribers with `reconnection_attempts=0` and delegate polling fallback, reconnect backoff, and setup deadlines to `_internal/_observation_delivery.py::ObservationDelivery`. Subscribers close any socket left by a failed or cancelled `__aenter__`, since callers never exit a context that failed to enter.
32
- - **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `prefect-client` depends on `whenever` only on Python 3.13+, so modules it ships must keep `whenever` imports behind `sys.version_info >= (3, 13)`; only server code that the client build strips may import it unconditionally (see `client/AGENTS.md`). `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences across supported whenever releases. Version-specific code is guarded by feature-detection flags (`_WHENEVER_NEW_API` for ≥ 0.10.0, `_SYSTEM_TZ` for ≥ 0.11), not version checks. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Likewise avoid `.assume_system_tz()`/`.to_system_tz()` (deprecated in 0.11; the warning fails tests under `filterwarnings = error`) — use `in_local_tz()` — and direct `DateTimeDelta` imports (removed in 0.11) — use the `Interval` alias. Violations will silently break on whichever whenever version the helpers weren't written for.
32
+ - **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `prefect-client` depends on `whenever` only on Python 3.13+, so modules it ships must keep `whenever` imports behind `sys.version_info >= (3, 13)`; only code that the client build strips may import it unconditionally (see the repo-root `client/AGENTS.md`). `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences across supported whenever releases. Version-specific code is guarded by feature-detection flags (`_WHENEVER_NEW_API` for ≥ 0.10.0, `_SYSTEM_TZ` for ≥ 0.11), not version checks. These flags are only probed on Python 3.13+ (`_WHENEVER_NEW_API` is `False` and `_SYSTEM_TZ` is undefined on 3.11/3.12), so a helper that server-only code calls on every Python must feature-detect on the `whenever` class itself. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Likewise avoid `.assume_system_tz()`/`.to_system_tz()` (deprecated in 0.11; the warning fails tests under `filterwarnings = error`) — use `in_local_tz()` — and direct `DateTimeDelta` imports (removed in 0.11) — use the `Interval` alias. Violations will silently break on whichever whenever version the helpers weren't written for.
33
33
  - **Call Pendulum-only members via `types/_datetime.py::_pendulum_call` on Python 3.11/3.12.** Prefect's `DateTime`/`Date`/`Duration` wrap Pendulum-only members (and some shared stdlib methods like `replace`) with user-facing deprecation warnings; `_pendulum_call` bypasses them so users only see warnings for their own calls. `pyproject.toml` ignores these warnings in pytest, so direct calls from Prefect code pass tests silently unless covered by the guards in `tests/test_datetime.py`.
34
34
  - **Flow and task engines advance state differently.** The flow engine makes blocking API calls to the server to propose and advance states. The task engine emits `prefect.task_run.*` events (delivered via WebSockets) but advances state locally through `set_state` calls with polling/backoff — do not assume the two engines work the same way.
35
35
  - **Flow state transitions go through the server.** The flow engine proposes states to the server, which accepts or rejects them via orchestration rules. The task engine, by contrast, manages state transitions locally via `set_state` and emits `prefect.task_run.*` events — it does not propose states to the server.
@@ -41,6 +41,7 @@ Runtime flow/task parameter values must come from `utilities.callables.get_call_
41
41
  - **`ResultRecordMetadata` tolerates unknown serializer types.** When loading persisted metadata, an unrecognized serializer `type` is converted to an `UnknownSerializer` placeholder rather than raising `ValidationError`. This allows inspecting result metadata when the serializer implementation is unavailable in the current environment. However, known serializer types with invalid fields still raise `ValidationError`. `UnknownSerializer.dumps()` and `UnknownSerializer.loads()` raise `RuntimeError` — the tolerance is for inspection only, not actual serialization/deserialization.
42
42
  - **`ResultRecord` must be marked persisted after every storage write.** `ResultStore` calls `mark_persisted()` on every record it writes; `to_state_create` in `states.py` consults `is_persisted` as a fallback when `should_persist_result()` returns `False` (e.g., after run context teardown). Any new sync or async persist path that omits `mark_persisted()` will silently drop state metadata for already-written results.
43
43
  - **Flow-run suspension is enforced at orchestration boundaries.** Suspension is delivered via `FlowRunSuspensionRequest` and raised with `raise_if_flow_run_suspension_requested()`. When changing engines, futures, task runners, or generator execution, check before returning control to flow user code or proposing a flow state that could leave `Suspended`; keep sync/async paths aligned and avoid per-boundary API reads.
44
+ - **Flow state hooks accept the same signatures on every execution path.** The sync and async flow engines and `runner/_hook_runner.py` share `_internal/engine.py::resolve_flow_hook_arguments`; `runner/_workspace_runtime_bootstrap.py` keeps its own copy because it may run under an older Prefect. Change the shared function and the copy together.
44
45
  - **Subflow tracking tasks use UUID dynamic keys when called from within a submitted task.** `flow_engine.py` marks the synthetic tracking `Task` with `_is_subflow_tracking_task=True`; `tasks.py` checks this flag to assign UUID-based (unstable) `dynamic_key` values when the tracking task runs inside a submitted task context. This prevents key collisions between concurrent sibling subflows on parent-flow retry. Direct subflow calls (no enclosing task context) keep stable sequential keys to preserve the retry optimization that reuses completed subflow results.
45
46
 
46
47
  ## Logging
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.9.2"
3
+ __build_date__ = "2026-11-06 21:19:45.400356+00:00"
4
+ __git_commit__ = "b0479c0c26045b06321191bbad0cdfbb334d7380"
5
+ __dirty__ = False
@@ -1,5 +1,6 @@
1
1
  """Internal engine utilities"""
2
2
 
3
+ import inspect
3
4
  from collections.abc import Callable
4
5
  from functools import partial
5
6
  from typing import TYPE_CHECKING, Any, Union
@@ -9,6 +10,9 @@ from prefect.context import FlowRunContext
9
10
  from prefect.flows import Flow
10
11
  from prefect.tasks import Task, TaskRunNameCallbackWithParameters
11
12
 
13
+ if TYPE_CHECKING:
14
+ from prefect.client.schemas.objects import FlowRun, State
15
+
12
16
 
13
17
  def dynamic_key_for_task_run(
14
18
  context: FlowRunContext, task: "Task[..., Any]", stable: bool = True
@@ -93,3 +97,58 @@ def get_hook_name(hook: Callable[..., Any]) -> str:
93
97
  hook.func.__name__ if isinstance(hook, partial) else hook.__class__.__name__
94
98
  )
95
99
  )
100
+
101
+
102
+ def resolve_flow_hook_arguments(
103
+ hook: Callable[..., Any],
104
+ flow: "Flow[..., Any]",
105
+ flow_run: "FlowRun",
106
+ state: "State",
107
+ ) -> tuple[tuple[Any, ...], dict[str, Any]]:
108
+ """
109
+ Return the positional and keyword arguments to call a flow state hook with,
110
+ checking its signature without calling it.
111
+
112
+ A hook that names its parameters `flow`, `flow_run` (or `run`) and `state`
113
+ gets them by name, in any order and including keyword-only parameters.
114
+ Otherwise, a hook that takes three positional arguments gets them in that
115
+ order, whatever their names, and a hook that only takes keyword arguments
116
+ gets them by name.
117
+
118
+ Raises:
119
+ TypeError: if the hook accepts none of these forms.
120
+ """
121
+ try:
122
+ signature = inspect.signature(hook)
123
+ except (TypeError, ValueError):
124
+ return (flow, flow_run, state), {}
125
+
126
+ def binds(*args: Any, **kwargs: Any) -> bool:
127
+ try:
128
+ signature.bind(*args, **kwargs)
129
+ except TypeError:
130
+ return False
131
+ return True
132
+
133
+ named = (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY)
134
+ for flow_run_name in ("flow_run", "run"):
135
+ kwargs = {"flow": flow, flow_run_name: flow_run, "state": state}
136
+ declared = all(
137
+ name in signature.parameters and signature.parameters[name].kind in named
138
+ for name in kwargs
139
+ )
140
+ if declared and binds(**kwargs):
141
+ return (), kwargs
142
+
143
+ if binds(flow, flow_run, state):
144
+ return (flow, flow_run, state), {}
145
+
146
+ kwargs = {"flow": flow, "flow_run": flow_run, "state": state}
147
+ if binds(**kwargs):
148
+ return (), kwargs
149
+
150
+ raise TypeError(
151
+ f"Hook {get_hook_name(hook)!r} must accept the flow, the flow run and the"
152
+ " state as three positional arguments or as parameters named `flow`,"
153
+ " `flow_run` (or `run`) and `state`"
154
+ )
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import datetime
4
+ import json
4
5
  import warnings
5
6
  from collections.abc import Callable, Mapping
6
7
  from enum import Enum
@@ -17,7 +18,6 @@ from typing import (
17
18
  )
18
19
  from uuid import UUID
19
20
 
20
- import orjson
21
21
  from pydantic import (
22
22
  AfterValidator,
23
23
  ConfigDict,
@@ -1768,7 +1768,7 @@ class FlowRunInput(ObjectBaseModel):
1768
1768
  Returns:
1769
1769
  Any: the decoded value
1770
1770
  """
1771
- return orjson.loads(self.value)
1771
+ return json.loads(self.value)
1772
1772
 
1773
1773
 
1774
1774
  class GlobalConcurrencyLimit(ObjectBaseModel):
@@ -18,7 +18,7 @@ Does NOT define concurrency limits (server-side in `server/`). Does NOT handle t
18
18
 
19
19
  **`raise_on_lease_renewal_failure` (public parameter):** Controls lease renewal failure behavior independently from `strict`. When `None` (default), falls back to the value of `strict` for backward compatibility. Set to `False` to let long-running tasks continue even if a transient renewal error occurs; set to `True` to terminate immediately on renewal failure regardless of `strict`. This means `strict=True, raise_on_lease_renewal_failure=False` gives strict slot acquisition but non-fatal renewal failures, and vice versa.
20
20
 
21
- **Lease renewal:** `_leases.py` starts a daemon thread that renews immediately on entry, then waits for 75% of `lease_duration` between renewals. The renewal thread uses the standard `get_client(sync_client=True)` path and retries each renewal up to 3 times with exponential backoff. If all attempts fail, a shared failure handler either cancels execution with the existing sync/async cancel scope or logs a warning, depending on `raise_on_lease_renewal_failure`.
21
+ **Lease renewal:** `_leases.py` starts a daemon thread that renews immediately on entry, then waits for 75% of `lease_duration` between renewals. The renewal thread uses the standard `get_client(sync_client=True)` path and retries each renewal up to 3 times with exponential backoff. If all attempts fail, a shared failure handler either cancels execution with the existing sync/async cancel scope or logs a warning, depending on `raise_on_lease_renewal_failure`. Exception: when a `flow_run_id` is given and renewal fails with `410 Gone`, the thread reads the flow run and stops without cancelling if its server state is final, because the terminal transition releases the lease before the engine receives the proposal response.
22
22
 
23
23
  **Sync/async lockstep invariant:** `asyncio.py`/`sync.py` and `_asyncio.py`/`_sync.py` are parallel implementations. Any behavior change to one must be mirrored in the other.
24
24
 
@@ -4,6 +4,9 @@ from contextlib import asynccontextmanager, contextmanager
4
4
  from typing import TYPE_CHECKING, AsyncGenerator, Generator
5
5
  from uuid import UUID
6
6
 
7
+ import httpx
8
+
9
+ from prefect._internal.compatibility.starlette import status
7
10
  from prefect._internal.concurrency.cancellation import (
8
11
  AsyncCancelScope,
9
12
  WatcherThreadCancelScope,
@@ -90,6 +93,45 @@ def _lease_renewal_loop(
90
93
  stop_event.wait(lease_duration * _RENEWAL_FRACTION)
91
94
 
92
95
 
96
+ def _lease_released_by_final_flow_run(
97
+ exc: BaseException, lease_id: UUID, flow_run_id: UUID | None
98
+ ) -> bool:
99
+ """
100
+ Check whether a lease renewal failure is explained by the flow run having
101
+ reached a final state on the server, which releases the lease before the
102
+ engine has received the response to its terminal state proposal.
103
+ """
104
+ if flow_run_id is None or not (
105
+ isinstance(exc, httpx.HTTPStatusError)
106
+ and exc.response.status_code == status.HTTP_410_GONE
107
+ ):
108
+ return False
109
+
110
+ logger = get_logger("concurrency")
111
+ try:
112
+ with get_client(sync_client=True) as client:
113
+ flow_run = client.read_flow_run(flow_run_id)
114
+ except Exception:
115
+ logger.debug(
116
+ "Failed to read flow run %s after its concurrency lease was not found",
117
+ flow_run_id,
118
+ exc_info=True,
119
+ )
120
+ return False
121
+
122
+ if flow_run.state is None or not flow_run.state.is_final():
123
+ return False
124
+
125
+ logger.debug(
126
+ "Concurrency lease %s was released because flow run %s reached final "
127
+ "state %s; stopping lease renewal",
128
+ lease_id,
129
+ flow_run_id,
130
+ flow_run.state.type.value,
131
+ )
132
+ return True
133
+
134
+
93
135
  def _handle_lease_renewal_failure(
94
136
  exc: BaseException,
95
137
  lease_id: UUID,
@@ -139,6 +181,7 @@ def _start_lease_renewal_thread(
139
181
  raise_on_lease_renewal_failure: bool,
140
182
  suppress_warnings: bool,
141
183
  cancel_scope: AsyncCancelScope | WatcherThreadCancelScope,
184
+ flow_run_id: UUID | None = None,
142
185
  ) -> tuple[threading.Event, threading.Thread]:
143
186
  stop_event = threading.Event()
144
187
  renewal_ctx = contextvars.copy_context()
@@ -152,14 +195,17 @@ def _start_lease_renewal_thread(
152
195
  try:
153
196
  _lease_renewal_loop(lease_id, lease_duration, stop_event)
154
197
  except Exception as exc:
155
- if not stop_event.is_set():
156
- _handle_lease_renewal_failure(
157
- exc,
158
- lease_id,
159
- raise_on_lease_renewal_failure,
160
- suppress_warnings,
161
- cancel_scope,
162
- )
198
+ if stop_event.is_set() or _lease_released_by_final_flow_run(
199
+ exc, lease_id, flow_run_id
200
+ ):
201
+ return
202
+ _handle_lease_renewal_failure(
203
+ exc,
204
+ lease_id,
205
+ raise_on_lease_renewal_failure,
206
+ suppress_warnings,
207
+ cancel_scope,
208
+ )
163
209
 
164
210
  def renewal_loop() -> None:
165
211
  renewal_ctx.run(_run_with_failure_handler)
@@ -179,6 +225,7 @@ def maintain_concurrency_lease(
179
225
  lease_duration: float,
180
226
  raise_on_lease_renewal_failure: bool = False,
181
227
  suppress_warnings: bool = False,
228
+ flow_run_id: UUID | None = None,
182
229
  ) -> Generator[None, None, None]:
183
230
  """
184
231
  Maintain a concurrency lease for the given lease ID.
@@ -187,6 +234,9 @@ def maintain_concurrency_lease(
187
234
  lease_id: The ID of the lease to maintain.
188
235
  lease_duration: The duration of the lease in seconds.
189
236
  raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
237
+ flow_run_id: The ID of the flow run holding the lease. When the lease is
238
+ not found and this flow run is final on the server, the lease was
239
+ released by the terminal transition and execution is not terminated.
190
240
  """
191
241
  with WatcherThreadCancelScope() as cancel_scope:
192
242
  stop_event: threading.Event | None = None
@@ -198,6 +248,7 @@ def maintain_concurrency_lease(
198
248
  raise_on_lease_renewal_failure,
199
249
  suppress_warnings,
200
250
  cancel_scope,
251
+ flow_run_id,
201
252
  )
202
253
  yield
203
254
  finally:
@@ -213,6 +264,7 @@ async def amaintain_concurrency_lease(
213
264
  lease_duration: float,
214
265
  raise_on_lease_renewal_failure: bool = False,
215
266
  suppress_warnings: bool = False,
267
+ flow_run_id: UUID | None = None,
216
268
  ) -> AsyncGenerator[None, None]:
217
269
  """
218
270
  Maintain a concurrency lease for the given lease ID.
@@ -221,6 +273,9 @@ async def amaintain_concurrency_lease(
221
273
  lease_id: The ID of the lease to maintain.
222
274
  lease_duration: The duration of the lease in seconds.
223
275
  raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
276
+ flow_run_id: The ID of the flow run holding the lease. When the lease is
277
+ not found and this flow run is final on the server, the lease was
278
+ released by the terminal transition and execution is not terminated.
224
279
  """
225
280
  with AsyncCancelScope() as cancel_scope:
226
281
  stop_event: threading.Event | None = None
@@ -231,6 +286,7 @@ async def amaintain_concurrency_lease(
231
286
  raise_on_lease_renewal_failure,
232
287
  suppress_warnings,
233
288
  cancel_scope,
289
+ flow_run_id,
234
290
  )
235
291
  yield
236
292
  finally:
@@ -1671,14 +1671,14 @@ async def adeploy(
1671
1671
  " or specify a remote storage location for the flow with `.from_source`."
1672
1672
  " If you are attempting to deploy a flow to a local process work pool,"
1673
1673
  " consider using `flow.serve` instead. See the documentation for more"
1674
- " information: https://www.prefect.io/docs/latest/how-to-guides/deployments/run-flows-in-local-processes"
1674
+ " information: https://www.prefect.io/docs/v3/how-to-guides/deployment_infra/run-flows-in-local-processes"
1675
1675
  )
1676
1676
  elif work_pool.type == "process" and not ignore_warnings:
1677
1677
  console.print(
1678
1678
  "Looks like you're deploying to a process work pool. If you're creating a"
1679
1679
  " deployment for local development, calling `.serve` on your flow is a great"
1680
1680
  " way to get started. See the documentation for more information:"
1681
- " https://www.prefect.io/docs/latest/how-to-guides/deployments/run-flows-in-local-processes "
1681
+ " https://www.prefect.io/docs/v3/how-to-guides/deployment_infra/run-flows-in-local-processes "
1682
1682
  " Set `ignore_warnings=True` to suppress this message.",
1683
1683
  style="yellow",
1684
1684
  )
@@ -1912,14 +1912,14 @@ def deploy(
1912
1912
  " or specify a remote storage location for the flow with `.from_source`."
1913
1913
  " If you are attempting to deploy a flow to a local process work pool,"
1914
1914
  " consider using `flow.serve` instead. See the documentation for more"
1915
- " information: https://www.prefect.io/docs/latest/how-to-guides/deployments/run-flows-in-local-processes"
1915
+ " information: https://www.prefect.io/docs/v3/how-to-guides/deployment_infra/run-flows-in-local-processes"
1916
1916
  )
1917
1917
  elif work_pool.type == "process" and not ignore_warnings:
1918
1918
  console.print(
1919
1919
  "Looks like you're deploying to a process work pool. If you're creating a"
1920
1920
  " deployment for local development, calling `.serve` on your flow is a great"
1921
1921
  " way to get started. See the documentation for more information:"
1922
- " https://www.prefect.io/docs/latest/how-to-guides/deployments/run-flows-in-local-processes "
1922
+ " https://www.prefect.io/docs/v3/how-to-guides/deployment_infra/run-flows-in-local-processes "
1923
1923
  " Set `ignore_warnings=True` to suppress this message.",
1924
1924
  style="yellow",
1925
1925
  )
@@ -547,7 +547,10 @@ class RemoteFileSystem(WritableFileSystem, WritableDeploymentStorage):
547
547
  counter = 0
548
548
  for f in Path(local_path).rglob("*"):
549
549
  relative_path = f.relative_to(local_path)
550
- if included_files and relative_path.as_posix() not in included_files:
550
+ if (
551
+ included_files is not None
552
+ and relative_path.as_posix() not in included_files
553
+ ):
551
554
  continue
552
555
 
553
556
  if to_path.endswith("/"):
@@ -603,7 +606,10 @@ class RemoteFileSystem(WritableFileSystem, WritableDeploymentStorage):
603
606
  counter = 0
604
607
  for f in Path(local_path).rglob("*"):
605
608
  relative_path = f.relative_to(local_path)
606
- if included_files and relative_path.as_posix() not in included_files:
609
+ if (
610
+ included_files is not None
611
+ and relative_path.as_posix() not in included_files
612
+ ):
607
613
  continue
608
614
 
609
615
  if to_path.endswith("/"):
@@ -11,7 +11,7 @@ import signal
11
11
  import sys
12
12
  import threading
13
13
  import time
14
- from collections.abc import Mapping
14
+ from collections.abc import Callable, Mapping
15
15
  from contextlib import (
16
16
  AsyncExitStack,
17
17
  ExitStack,
@@ -59,7 +59,11 @@ from prefect._internal.control_listener import (
59
59
  get_intent,
60
60
  report_engine_outcome,
61
61
  )
62
- from prefect._internal.engine import get_hook_name, resolve_custom_flow_run_name
62
+ from prefect._internal.engine import (
63
+ get_hook_name,
64
+ resolve_custom_flow_run_name,
65
+ resolve_flow_hook_arguments,
66
+ )
63
67
  from prefect._internal.metrics import RunMetrics
64
68
  from prefect.client.orchestration import PrefectClient, SyncPrefectClient, get_client
65
69
  from prefect.client.schemas import FlowRun, TaskRun
@@ -330,28 +334,40 @@ def _send_heartbeats(
330
334
  resource, related = engine._build_heartbeat_event_template()
331
335
 
332
336
  stop_event = threading.Event()
337
+ # The heartbeat thread checks for a stop and emits while holding this lock,
338
+ # so once `stop_heartbeats` returns, no heartbeat is mid-emit and none will
339
+ # be emitted.
340
+ emit_lock = threading.Lock()
333
341
 
334
- def heartbeat_loop() -> None:
335
- while not stop_event.is_set():
336
- # Check state before emitting - don't emit if final
337
- if (
338
- engine.flow_run
339
- and engine.flow_run.state
340
- and engine.flow_run.state.is_final()
341
- ):
342
- engine.logger.debug("Flow run in terminal state, stopping heartbeat")
343
- return
342
+ def stop_heartbeats() -> None:
343
+ with emit_lock:
344
+ stop_event.set()
344
345
 
345
- try:
346
- engine._emit_flow_run_heartbeat(resource, related)
347
- except Exception:
348
- engine.logger.debug("Failed to emit heartbeat", exc_info=True)
349
-
350
- # Sleep in increments to allow quick shutdown
351
- for _ in range(heartbeat_seconds):
346
+ def heartbeat_loop() -> None:
347
+ while True:
348
+ with emit_lock:
352
349
  if stop_event.is_set():
353
350
  return
354
- time.sleep(1)
351
+
352
+ # Check state before emitting - don't emit if final
353
+ if (
354
+ engine.flow_run
355
+ and engine.flow_run.state
356
+ and engine.flow_run.state.is_final()
357
+ ):
358
+ engine.logger.debug(
359
+ "Flow run in terminal state, stopping heartbeat"
360
+ )
361
+ return
362
+
363
+ try:
364
+ engine._emit_flow_run_heartbeat(resource, related)
365
+ except Exception:
366
+ engine.logger.debug("Failed to emit heartbeat", exc_info=True)
367
+
368
+ # Waiting on the event wakes the thread as soon as heartbeats stop
369
+ if stop_event.wait(heartbeat_seconds):
370
+ return
355
371
 
356
372
  # Copy the current context so the heartbeat thread sees the same
357
373
  # `SettingsContext` (and therefore the same `PREFECT_API_URL`) as the
@@ -366,13 +382,14 @@ def _send_heartbeats(
366
382
  thread = threading.Thread(
367
383
  target=heartbeat_ctx.run, args=(heartbeat_loop,), daemon=True
368
384
  )
385
+ engine._stop_heartbeats = stop_heartbeats
369
386
  thread.start()
370
387
  engine.logger.debug("Started flow run heartbeat context")
371
388
 
372
389
  try:
373
390
  yield
374
391
  finally:
375
- stop_event.set()
392
+ stop_heartbeats()
376
393
  if join_on_exit:
377
394
  thread.join(timeout=2)
378
395
  engine.logger.debug("Stopped flow run heartbeat context")
@@ -424,6 +441,15 @@ class BaseFlowRunEngine(Generic[P, R]):
424
441
  default_factory=FlowRunSuspensionRequest
425
442
  )
426
443
  _attempt_conclusion: EngineOutcomeReceipt | None = field(default=None, init=False)
444
+ # Stops the heartbeat thread started by the most recent `_send_heartbeats`.
445
+ # `set_state` calls it before proposing a terminal state: the server
446
+ # timestamps that state when it accepts it, but the heartbeat thread sees
447
+ # it only after the response arrives. A heartbeat sent in that gap occurs
448
+ # after the terminal state, and an automation that expects every heartbeat
449
+ # to be followed by another event then fires on the finished run.
450
+ _stop_heartbeats: Callable[[], None] | None = field(
451
+ default=None, init=False, repr=False
452
+ )
427
453
 
428
454
  def __post_init__(self) -> None:
429
455
  if self.flow is None and self.flow_run_id is None:
@@ -757,6 +783,9 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
757
783
  if self.short_circuit:
758
784
  return self.state
759
785
 
786
+ if state.is_final() and self._stop_heartbeats is not None:
787
+ self._stop_heartbeats()
788
+
760
789
  state = propose_state_sync(
761
790
  self.client, state, flow_run_id=self.flow_run.id, force=force
762
791
  ) # type: ignore
@@ -1072,7 +1101,8 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
1072
1101
  f"Running hook {hook_name!r} in response to entering state"
1073
1102
  f" {state.name!r}"
1074
1103
  )
1075
- result = hook(flow, flow_run, state)
1104
+ args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
1105
+ result = hook(*args, **kwargs)
1076
1106
  if asyncio.iscoroutine(result):
1077
1107
  run_coro_as_sync(result)
1078
1108
  except Exception:
@@ -1137,7 +1167,10 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
1137
1167
  if lease_id := self.state.state_details.deployment_concurrency_lease_id:
1138
1168
  stack.enter_context(
1139
1169
  maintain_concurrency_lease(
1140
- lease_id, 300, raise_on_lease_renewal_failure=True
1170
+ lease_id,
1171
+ 300,
1172
+ raise_on_lease_renewal_failure=True,
1173
+ flow_run_id=self.flow_run.id,
1141
1174
  )
1142
1175
  )
1143
1176
 
@@ -1492,6 +1525,9 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1492
1525
  if self.short_circuit:
1493
1526
  return self.state
1494
1527
 
1528
+ if state.is_final() and self._stop_heartbeats is not None:
1529
+ self._stop_heartbeats()
1530
+
1495
1531
  state = await propose_state(
1496
1532
  self.client, state, flow_run_id=self.flow_run.id, force=force
1497
1533
  ) # type: ignore
@@ -1800,7 +1836,8 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1800
1836
  f"Running hook {hook_name!r} in response to entering state"
1801
1837
  f" {state.name!r}"
1802
1838
  )
1803
- result = hook(flow, flow_run, state)
1839
+ args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
1840
+ result = hook(*args, **kwargs)
1804
1841
  if asyncio.iscoroutine(result):
1805
1842
  await result
1806
1843
  except Exception:
@@ -1865,7 +1902,10 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1865
1902
  if lease_id := self.state.state_details.deployment_concurrency_lease_id:
1866
1903
  await stack.enter_async_context(
1867
1904
  amaintain_concurrency_lease(
1868
- lease_id, 300, raise_on_lease_renewal_failure=True
1905
+ lease_id,
1906
+ 300,
1907
+ raise_on_lease_renewal_failure=True,
1908
+ flow_run_id=self.flow_run.id,
1869
1909
  )
1870
1910
  )
1871
1911
 
@@ -133,6 +133,7 @@ async def wait_for_flow_run(
133
133
  )
134
134
 
135
135
  with anyio.move_on_after(timeout):
136
+ received_final_event = False
136
137
  async with get_events_subscriber(filter=event_filter) as subscriber:
137
138
  flow_run = await client.read_flow_run(flow_run_id)
138
139
  if flow_run.state and flow_run.state.is_final():
@@ -151,7 +152,19 @@ async def wait_for_flow_run(
151
152
  logger.info(f"Flow run is in state {state.name!r}")
152
153
 
153
154
  if state.is_final():
154
- return await client.read_flow_run(flow_run_id)
155
+ received_final_event = True
156
+ break
157
+
158
+ if received_final_event:
159
+ # A final state event can be delivered before the state change is
160
+ # visible to API reads, so read until the run reports a final state
161
+ poll_delay = 0.1
162
+ while True:
163
+ flow_run = await client.read_flow_run(flow_run_id)
164
+ if flow_run.state and flow_run.state.is_final():
165
+ return flow_run
166
+ await anyio.sleep(poll_delay)
167
+ poll_delay = min(poll_delay * 2, 5)
155
168
 
156
169
  raise FlowRunWaitTimeout(
157
170
  f"Flow run with ID {flow_run_id} exceeded watch timeout of {timeout} seconds"