prefect-client 3.9.2.dev4__tar.gz → 3.9.2.dev6__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.2.dev4 → prefect_client-3.9.2.dev6}/PKG-INFO +1 -1
  2. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/AGENTS.md +1 -0
  3. prefect_client-3.9.2.dev6/src/prefect/_build_info.py +5 -0
  4. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/engine.py +59 -0
  5. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/objects.py +2 -2
  6. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/flow_engine.py +57 -23
  7. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/flows.py +35 -10
  8. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/coiled.py +1 -1
  9. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/modal.py +1 -1
  10. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/input/actions.py +3 -2
  11. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/filesystem.py +9 -4
  12. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/memory.py +10 -5
  13. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/protocol.py +6 -0
  14. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/AGENTS.md +2 -0
  15. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_hook_runner.py +4 -5
  16. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_runtime_bootstrap.py +48 -8
  17. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/storage.py +18 -3
  18. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/deployments.py +3 -0
  19. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/flow_runs.py +3 -1
  20. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/server.py +3 -0
  21. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/work_queues.py +19 -12
  22. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/workers.py +17 -14
  23. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/task_runners.py +10 -1
  24. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/callables/__init__.py +6 -3
  25. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/collections.py +10 -1
  26. prefect_client-3.9.2.dev4/src/prefect/_build_info.py +0 -5
  27. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/.gitignore +0 -0
  28. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/LICENSE +0 -0
  29. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/README.md +0 -0
  30. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/hatch_build.py +0 -0
  31. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/pyproject.toml +0 -0
  32. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/.prefectignore +0 -0
  33. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/__init__.py +0 -0
  34. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/__main__.py +0 -0
  35. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/__init__.py +0 -0
  36. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/_launchers.py +0 -0
  37. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/bundles/__init__.py +0 -0
  38. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/bundles/execute.py +0 -0
  39. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/__init__.py +0 -0
  40. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/apply.py +0 -0
  41. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  42. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/manager.py +0 -0
  43. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/spec.py +0 -0
  44. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/sla/__init__.py +0 -0
  45. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/sla/client.py +0 -0
  46. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/sla/objects.py +0 -0
  47. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_flow_run_suspension.py +0 -0
  48. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/__init__.py +0 -0
  49. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/_logging.py +0 -0
  50. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/_observation_delivery.py +0 -0
  51. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/__init__.py +0 -0
  52. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  53. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/client.py +0 -0
  54. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/device_id.py +0 -0
  55. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/emit.py +0 -0
  56. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/enabled.py +0 -0
  57. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/events.py +0 -0
  58. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/milestones.py +0 -0
  59. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/notice.py +0 -0
  60. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/service.py +0 -0
  61. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/ast_utils.py +0 -0
  62. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/attempt_control.py +0 -0
  63. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/buildx.py +0 -0
  64. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/__init__.py +0 -0
  65. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  66. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/backports.py +0 -0
  67. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/blocks.py +0 -0
  68. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  69. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  70. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/migration.py +0 -0
  71. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/starlette.py +0 -0
  72. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/__init__.py +0 -0
  73. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/api.py +0 -0
  74. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/calls.py +0 -0
  75. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  76. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  77. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/inspection.py +0 -0
  78. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/primitives.py +0 -0
  79. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/services.py +0 -0
  80. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/threads.py +0 -0
  81. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/waiters.py +0 -0
  82. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/control_listener.py +0 -0
  83. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/deprecated.py +0 -0
  84. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/git.py +0 -0
  85. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  86. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/installation.py +0 -0
  87. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/integrations.py +0 -0
  88. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/launchers.py +0 -0
  89. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/lazy.py +0 -0
  90. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/metrics.py +0 -0
  91. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/observability.py +0 -0
  92. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/observers.py +0 -0
  93. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/__init__.py +0 -0
  94. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/apply.py +0 -0
  95. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/collections.py +0 -0
  96. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  97. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/manager.py +0 -0
  98. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/spec.py +0 -0
  99. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/startup.py +0 -0
  100. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/__init__.py +0 -0
  101. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/schemas.py +0 -0
  102. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  103. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  104. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  105. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pytz.py +0 -0
  106. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/result_records.py +0 -0
  107. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/retries.py +0 -0
  108. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schema.py +0 -0
  109. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/__init__.py +0 -0
  110. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/_registry.py +0 -0
  111. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/bases.py +0 -0
  112. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/fields.py +0 -0
  113. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/serializers.py +0 -0
  114. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/validators.py +0 -0
  115. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  116. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/server_maintenance.py +0 -0
  117. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/states.py +0 -0
  118. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/testing.py +0 -0
  119. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/urls.py +0 -0
  120. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/uuid7.py +0 -0
  121. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/version_checking.py +0 -0
  122. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/versioning.py +0 -0
  123. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/waiters.py +0 -0
  124. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/websockets.py +0 -0
  125. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/__init__.py +0 -0
  126. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/fetcher.py +0 -0
  127. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/generator.py +0 -0
  128. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/models.py +0 -0
  129. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/naming.py +0 -0
  130. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/renderer.py +0 -0
  131. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/schema_converter.py +0 -0
  132. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/templates/__init__.py +0 -0
  133. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  134. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/types.py +0 -0
  135. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/unions.py +0 -0
  136. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_vendor/croniter/__init__.py +0 -0
  137. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_vendor/croniter/croniter.py +0 -0
  138. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/agent.py +0 -0
  139. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/analytics/__init__.py +0 -0
  140. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/artifacts.py +0 -0
  141. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/assets/__init__.py +0 -0
  142. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/assets/core.py +0 -0
  143. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/assets/materialize.py +0 -0
  144. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/automations.py +0 -0
  145. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/AGENTS.md +0 -0
  146. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/__init__.py +0 -0
  147. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/abstract.py +0 -0
  148. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/core.py +0 -0
  149. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/fields.py +0 -0
  150. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/notifications.py +0 -0
  151. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/redis.py +0 -0
  152. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/system.py +0 -0
  153. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/webhook.py +0 -0
  154. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/__init__.py +0 -0
  155. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_file_collector.py +0 -0
  156. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_ignore_filter.py +0 -0
  157. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_path_resolver.py +0 -0
  158. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_zip_builder.py +0 -0
  159. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_zip_extractor.py +0 -0
  160. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/execute.py +0 -0
  161. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/cache_policies.py +0 -0
  162. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/AGENTS.md +0 -0
  163. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/__init__.py +0 -0
  164. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/attribution.py +0 -0
  165. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/base.py +0 -0
  166. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/cloud.py +0 -0
  167. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/collections.py +0 -0
  168. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/constants.py +0 -0
  169. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/__init__.py +0 -0
  170. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  171. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  172. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  173. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_automations/client.py +0 -0
  174. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  175. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  176. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  177. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  178. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  179. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  180. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  181. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  182. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  183. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  184. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  185. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_events/client.py +0 -0
  186. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  187. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  188. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  189. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_flows/client.py +0 -0
  190. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  191. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_logs/client.py +0 -0
  192. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  193. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_variables/client.py +0 -0
  194. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  195. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  196. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/base.py +0 -0
  197. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/routes.py +0 -0
  198. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/__init__.py +0 -0
  199. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/actions.py +0 -0
  200. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/events.py +0 -0
  201. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/filters.py +0 -0
  202. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/responses.py +0 -0
  203. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/schedules.py +0 -0
  204. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/sorting.py +0 -0
  205. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/worker_channel.py +0 -0
  206. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/subscriptions.py +0 -0
  207. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/types/__init__.py +0 -0
  208. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  209. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/utilities.py +0 -0
  210. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/AGENTS.md +0 -0
  211. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/__init__.py +0 -0
  212. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/_asyncio.py +0 -0
  213. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/_events.py +0 -0
  214. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/_leases.py +0 -0
  215. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/_sync.py +0 -0
  216. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/asyncio.py +0 -0
  217. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/context.py +0 -0
  218. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/services.py +0 -0
  219. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/sync.py +0 -0
  220. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/__init__.py +0 -0
  221. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  222. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/_events.py +0 -0
  223. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/asyncio.py +0 -0
  224. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/context.py +0 -0
  225. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/services.py +0 -0
  226. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/sync.py +0 -0
  227. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/context.py +0 -0
  228. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/AGENTS.md +0 -0
  229. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/__init__.py +0 -0
  230. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/base.py +0 -0
  231. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/deployments.py +0 -0
  232. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/flow_runs.py +0 -0
  233. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/runner.py +0 -0
  234. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/schedules.py +0 -0
  235. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/steps/__init__.py +0 -0
  236. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/steps/core.py +0 -0
  237. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/steps/pull.py +0 -0
  238. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/steps/utility.py +0 -0
  239. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/docker/__init__.py +0 -0
  240. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/docker/_buildx.py +0 -0
  241. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/docker/docker_image.py +0 -0
  242. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/engine.py +0 -0
  243. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/AGENTS.md +0 -0
  244. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/__init__.py +0 -0
  245. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/actions.py +0 -0
  246. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/clients.py +0 -0
  247. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/filters.py +0 -0
  248. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/related.py +0 -0
  249. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/__init__.py +0 -0
  250. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/automations.py +0 -0
  251. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  252. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/events.py +0 -0
  253. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/labelling.py +0 -0
  254. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/subscribers.py +0 -0
  255. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/utilities.py +0 -0
  256. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/worker.py +0 -0
  257. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/exceptions.py +0 -0
  258. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/filesystems.py +0 -0
  259. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/flow_runs.py +0 -0
  260. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/futures.py +0 -0
  261. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/__init__.py +0 -0
  262. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/base.py +0 -0
  263. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  264. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  265. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  266. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  267. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/input/__init__.py +0 -0
  268. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/input/run_input.py +0 -0
  269. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/__init__.py +0 -0
  270. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/_filelock.py +0 -0
  271. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/AGENTS.md +0 -0
  272. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/__init__.py +0 -0
  273. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/clients.py +0 -0
  274. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/configuration.py +0 -0
  275. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/filters.py +0 -0
  276. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/formatters.py +0 -0
  277. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/handlers.py +0 -0
  278. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/highlighters.py +0 -0
  279. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/loggers.py +0 -0
  280. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/logging.yml +0 -0
  281. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/main.py +0 -0
  282. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/plugins.py +0 -0
  283. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/py.typed +0 -0
  284. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/results.py +0 -0
  285. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/__init__.py +0 -0
  286. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_cancel_finalizer.py +0 -0
  287. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_cancellation_manager.py +0 -0
  288. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_control_channel.py +0 -0
  289. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_deployment_registry.py +0 -0
  290. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_event_emitter.py +0 -0
  291. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_flow_resolver.py +0 -0
  292. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_flow_run_executor.py +0 -0
  293. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_limit_manager.py +0 -0
  294. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_process_manager.py +0 -0
  295. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  296. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_starter_bundle.py +0 -0
  297. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_starter_direct.py +0 -0
  298. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_starter_engine.py +0 -0
  299. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_state_proposer.py +0 -0
  300. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_uv_command.py +0 -0
  301. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_hook_runner.py +0 -0
  302. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_resolver.py +0 -0
  303. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_runtime.py +0 -0
  304. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_starter.py +0 -0
  305. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_supervisor.py +0 -0
  306. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/runner.py +0 -0
  307. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/server.py +0 -0
  308. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runtime/__init__.py +0 -0
  309. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runtime/deployment.py +0 -0
  310. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runtime/flow_run.py +0 -0
  311. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runtime/task_run.py +0 -0
  312. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/schedules.py +0 -0
  313. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/serializers.py +0 -0
  314. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/__init__.py +0 -0
  315. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/_ui_static.py +0 -0
  316. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/admin.py +0 -0
  317. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/artifacts.py +0 -0
  318. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/automations.py +0 -0
  319. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/background_workers.py +0 -0
  320. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/block_capabilities.py +0 -0
  321. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/block_documents.py +0 -0
  322. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/block_schemas.py +0 -0
  323. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/block_types.py +0 -0
  324. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/clients.py +0 -0
  325. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/collections.py +0 -0
  326. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  327. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/concurrency_limits.py +0 -0
  328. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  329. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/csrf_token.py +0 -0
  330. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/dependencies.py +0 -0
  331. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/events.py +0 -0
  332. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/flow_run_states.py +0 -0
  333. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/flows.py +0 -0
  334. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/logs.py +0 -0
  335. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/middleware.py +0 -0
  336. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/observed_states.py +0 -0
  337. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/root.py +0 -0
  338. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/run_history.py +0 -0
  339. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/saved_searches.py +0 -0
  340. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  341. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/task_run_states.py +0 -0
  342. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/task_runs.py +0 -0
  343. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/task_workers.py +0 -0
  344. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/templates.py +0 -0
  345. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/__init__.py +0 -0
  346. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/flow_runs.py +0 -0
  347. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/flows.py +0 -0
  348. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/schemas.py +0 -0
  349. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/task_runs.py +0 -0
  350. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/validation.py +0 -0
  351. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/variables.py +0 -0
  352. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/AGENTS.md +0 -0
  353. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/__init__.py +0 -0
  354. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/_types.py +0 -0
  355. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/base.py +0 -0
  356. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/constants.py +0 -0
  357. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/context.py +0 -0
  358. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/legacy.py +0 -0
  359. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/__init__.py +0 -0
  360. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/_defaults.py +0 -0
  361. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/api.py +0 -0
  362. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/cli.py +0 -0
  363. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/client.py +0 -0
  364. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/cloud.py +0 -0
  365. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/deployments.py +0 -0
  366. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/events.py +0 -0
  367. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/experiments.py +0 -0
  368. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/flows.py +0 -0
  369. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/internal.py +0 -0
  370. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/logging.py +0 -0
  371. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/plugins.py +0 -0
  372. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/results.py +0 -0
  373. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/root.py +0 -0
  374. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/runner.py +0 -0
  375. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/__init__.py +0 -0
  376. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/api.py +0 -0
  377. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/concurrency.py +0 -0
  378. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/database.py +0 -0
  379. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/deployments.py +0 -0
  380. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/docket.py +0 -0
  381. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/ephemeral.py +0 -0
  382. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/events.py +0 -0
  383. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  384. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/logs.py +0 -0
  385. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/root.py +0 -0
  386. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/services.py +0 -0
  387. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/tasks.py +0 -0
  388. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/ui.py +0 -0
  389. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/worker_channel.py +0 -0
  390. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/tasks.py +0 -0
  391. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/telemetry.py +0 -0
  392. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/testing.py +0 -0
  393. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/worker.py +0 -0
  394. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/profiles.py +0 -0
  395. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/profiles.toml +0 -0
  396. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/sources.py +0 -0
  397. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/states.py +0 -0
  398. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/task_engine.py +0 -0
  399. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/task_runs.py +0 -0
  400. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/task_worker.py +0 -0
  401. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/tasks.py +0 -0
  402. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/telemetry/__init__.py +0 -0
  403. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/telemetry/run_telemetry.py +0 -0
  404. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/transactions.py +0 -0
  405. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/__init__.py +0 -0
  406. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/_concurrency.py +0 -0
  407. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/_datetime.py +0 -0
  408. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/_datetime_deprecations.py +0 -0
  409. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/entrypoint.py +0 -0
  410. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/names.py +0 -0
  411. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/AGENTS.md +0 -0
  412. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/__init__.py +0 -0
  413. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/annotations.py +0 -0
  414. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  415. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  416. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/callables/AGENTS.md +0 -0
  417. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/compat.py +0 -0
  418. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/context.py +0 -0
  419. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/dispatch.py +0 -0
  420. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/dockerutils.py +0 -0
  421. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/engine/AGENTS.md +0 -0
  422. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/engine/__init__.py +0 -0
  423. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  424. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/filesystem/__init__.py +0 -0
  425. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/generics.py +0 -0
  426. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/hashing.py +0 -0
  427. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/importtools.py +0 -0
  428. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/math.py +0 -0
  429. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/names.py +0 -0
  430. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  431. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/processutils/__init__.py +0 -0
  432. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/pydantic.py +0 -0
  433. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/render_swagger.py +0 -0
  434. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  435. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  436. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  437. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/schema_tools/validation.py +0 -0
  438. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/services.py +0 -0
  439. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/slugify.py +0 -0
  440. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/templating/AGENTS.md +0 -0
  441. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/templating/__init__.py +0 -0
  442. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/text.py +0 -0
  443. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/timeout.py +0 -0
  444. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/urls.py +0 -0
  445. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/visualization.py +0 -0
  446. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/variables.py +0 -0
  447. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/AGENTS.md +0 -0
  448. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/__init__.py +0 -0
  449. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_cleanup.py +0 -0
  450. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_cleanup_handlers.py +0 -0
  451. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  452. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  453. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/_state.py +0 -0
  454. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  455. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  456. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/base.py +0 -0
  457. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/block.py +0 -0
  458. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/cloud.py +0 -0
  459. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/process.py +0 -0
  460. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/server.py +0 -0
  461. {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/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.2.dev4
3
+ Version: 3.9.2.dev6
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
@@ -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.dev6"
3
+ __build_date__ = "2026-11-06 08:12:53.240258+00:00"
4
+ __git_commit__ = "802fc9435423bed0d16fe30862de25a8df62493f"
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):
@@ -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
344
-
345
- try:
346
- engine._emit_flow_run_heartbeat(resource, related)
347
- except Exception:
348
- engine.logger.debug("Failed to emit heartbeat", exc_info=True)
342
+ def stop_heartbeats() -> None:
343
+ with emit_lock:
344
+ stop_event.set()
349
345
 
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:
@@ -1495,6 +1525,9 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1495
1525
  if self.short_circuit:
1496
1526
  return self.state
1497
1527
 
1528
+ if state.is_final() and self._stop_heartbeats is not None:
1529
+ self._stop_heartbeats()
1530
+
1498
1531
  state = await propose_state(
1499
1532
  self.client, state, flow_run_id=self.flow_run.id, force=force
1500
1533
  ) # type: ignore
@@ -1803,7 +1836,8 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1803
1836
  f"Running hook {hook_name!r} in response to entering state"
1804
1837
  f" {state.name!r}"
1805
1838
  )
1806
- result = hook(flow, flow_run, state)
1839
+ args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
1840
+ result = hook(*args, **kwargs)
1807
1841
  if asyncio.iscoroutine(result):
1808
1842
  await result
1809
1843
  except Exception:
@@ -121,15 +121,22 @@ F = TypeVar("F", bound="Flow[Any, Any]") # The type of the flow
121
121
  class FlowStateHook(Protocol, Generic[P, R]):
122
122
  """
123
123
  A callable that is invoked when a flow enters a given state.
124
+
125
+ It receives the flow, the flow run, and the state as its first three
126
+ parameters, whatever their names. A hook whose parameters are named `flow`,
127
+ `flow_run` (or `run`), and `state` receives them by name instead.
124
128
  """
125
129
 
126
130
  __name__: str
127
131
 
128
132
  def __call__(
129
- self, flow: Flow[P, R], flow_run: FlowRun, state: State
133
+ self, flow: Flow[P, R], flow_run: FlowRun, state: State, /
130
134
  ) -> Awaitable[None] | None: ...
131
135
 
132
136
 
137
+ _FlowStateHookT = TypeVar("_FlowStateHookT", bound="FlowStateHook[..., Any]")
138
+
139
+
133
140
  if TYPE_CHECKING:
134
141
  import logging
135
142
 
@@ -593,6 +600,11 @@ class Flow(Generic[P, R]):
593
600
  Validate parameters for compatibility with the flow by attempting to cast the inputs to the
594
601
  associated types specified by the function's type annotations.
595
602
 
603
+ Resolve saved block references by UUID or by a dictionary containing
604
+ `block_document_id` or `block_document_slug`. UUID strings, including UUID
605
+ URNs, retain their block-reference meaning. Other `$ref` values, such as
606
+ JSON Schema paths and URLs, are preserved as parameter data.
607
+
596
608
  Returns:
597
609
  A new dict of parameters that have been cast to the appropriate types
598
610
 
@@ -601,11 +613,24 @@ class Flow(Generic[P, R]):
601
613
  """
602
614
 
603
615
  def resolve_block_reference(data: Any | dict[str, Any]) -> Any:
604
- if isinstance(data, dict) and "$ref" in data:
605
- from prefect.blocks.core import Block
616
+ if not isinstance(data, dict) or "$ref" not in data:
617
+ return data
618
+
619
+ ref = data["$ref"]
620
+ if isinstance(ref, str):
621
+ try:
622
+ UUID(ref)
623
+ except ValueError:
624
+ return data
625
+ elif not isinstance(ref, UUID) and not (
626
+ isinstance(ref, dict)
627
+ and ("block_document_id" in ref or "block_document_slug" in ref)
628
+ ):
629
+ return data
630
+
631
+ from prefect.blocks.core import Block
606
632
 
607
- return Block.load_from_ref(data["$ref"], _sync=True)
608
- return data
633
+ return Block.load_from_ref(ref, _sync=True)
609
634
 
610
635
  try:
611
636
  parameters = visit_collection(
@@ -1004,23 +1029,23 @@ class Flow(Generic[P, R]):
1004
1029
  _sla=_sla,
1005
1030
  )
1006
1031
 
1007
- def on_completion(self, fn: FlowStateHook[P, R]) -> FlowStateHook[P, R]:
1032
+ def on_completion(self, fn: _FlowStateHookT) -> _FlowStateHookT:
1008
1033
  self.on_completion_hooks.append(fn)
1009
1034
  return fn
1010
1035
 
1011
- def on_cancellation(self, fn: FlowStateHook[P, R]) -> FlowStateHook[P, R]:
1036
+ def on_cancellation(self, fn: _FlowStateHookT) -> _FlowStateHookT:
1012
1037
  self.on_cancellation_hooks.append(fn)
1013
1038
  return fn
1014
1039
 
1015
- def on_crashed(self, fn: FlowStateHook[P, R]) -> FlowStateHook[P, R]:
1040
+ def on_crashed(self, fn: _FlowStateHookT) -> _FlowStateHookT:
1016
1041
  self.on_crashed_hooks.append(fn)
1017
1042
  return fn
1018
1043
 
1019
- def on_running(self, fn: FlowStateHook[P, R]) -> FlowStateHook[P, R]:
1044
+ def on_running(self, fn: _FlowStateHookT) -> _FlowStateHookT:
1020
1045
  self.on_running_hooks.append(fn)
1021
1046
  return fn
1022
1047
 
1023
- def on_failure(self, fn: FlowStateHook[P, R]) -> FlowStateHook[P, R]:
1048
+ def on_failure(self, fn: _FlowStateHookT) -> _FlowStateHookT:
1024
1049
  self.on_failure_hooks.append(fn)
1025
1050
  return fn
1026
1051
 
@@ -215,7 +215,7 @@ class CoiledPushProvisioner:
215
215
  else:
216
216
  raise RuntimeError(
217
217
  "Coiled credentials not found. Please create a new token by"
218
- " running [blue]coiled login[/] and try again."
218
+ " running `coiled login` and try again."
219
219
  )
220
220
 
221
221
  # Create the credentials block
@@ -220,7 +220,7 @@ class ModalPushProvisioner:
220
220
  else:
221
221
  raise RuntimeError(
222
222
  "Modal credentials not found. Please create a new token by"
223
- " running [blue]modal token new[/] and try again."
223
+ " running `modal token new` and try again."
224
224
  )
225
225
 
226
226
  # Create the credentials block
@@ -1,3 +1,4 @@
1
+ import json
1
2
  from typing import TYPE_CHECKING, Any, Optional, Set
2
3
  from uuid import UUID
3
4
 
@@ -236,7 +237,7 @@ async def aread_flow_run_input(
236
237
  return None
237
238
  raise
238
239
  else:
239
- return orjson.loads(value)
240
+ return json.loads(value)
240
241
 
241
242
 
242
243
  @async_dispatch(aread_flow_run_input)
@@ -261,7 +262,7 @@ def read_flow_run_input(key: str, flow_run_id: Optional[UUID] = None) -> Any:
261
262
  return None
262
263
  raise
263
264
  else:
264
- return orjson.loads(value)
265
+ return json.loads(value)
265
266
 
266
267
 
267
268
  @client_injector
@@ -194,13 +194,18 @@ class FileSystemLockManager(LockManager):
194
194
 
195
195
  def release_lock(self, key: str, holder: str) -> None:
196
196
  lock_path = self._lock_path_for_key(key)
197
- if not self.is_locked(key):
198
- raise ValueError(f"No lock for transaction with key {key}")
199
197
  if self.is_lock_holder(key, holder):
200
198
  Path(lock_path).unlink(missing_ok=True)
201
199
  self._locks.pop(key, None)
202
- else:
203
- raise ValueError(f"No lock held by {holder} for transaction with key {key}")
200
+ return
201
+ if not self.is_locked(key):
202
+ # The lock was already released or expired (e.g. its hold timeout
203
+ # elapsed or it was released during a task retry) — including
204
+ # between the checks above — so releasing it is a no-op, matching
205
+ # RedisLockManager.
206
+ self._locks.pop(key, None)
207
+ return
208
+ raise ValueError(f"No lock held by {holder} for transaction with key {key}")
204
209
 
205
210
  def is_locked(self, key: str, use_cache: bool = False) -> bool:
206
211
  if (lock_info := self._get_lock_info(key, use_cache=use_cache)) is None:
@@ -180,13 +180,18 @@ class MemoryLockManager(LockManager):
180
180
 
181
181
  def release_lock(self, key: str, holder: str) -> None:
182
182
  with self._locks_dict_lock:
183
- if key in self._locks and self._locks[key]["holder"] == holder:
184
- if (
185
- expiration_timer := self._locks[key]["expiration_timer"]
186
- ) is not None:
183
+ lock_info = self._locks.get(key)
184
+ if lock_info is not None and lock_info["holder"] == holder:
185
+ if (expiration_timer := lock_info["expiration_timer"]) is not None:
187
186
  expiration_timer.cancel()
188
- self._locks[key]["lock"].release()
187
+ if lock_info["lock"].locked():
188
+ lock_info["lock"].release()
189
189
  del self._locks[key]
190
+ elif lock_info is None or not lock_info["lock"].locked():
191
+ # The lock was already released or expired (e.g. its hold
192
+ # timeout elapsed or it was released during a task retry);
193
+ # releasing it is a no-op, matching RedisLockManager.
194
+ return
190
195
  else:
191
196
  raise ValueError(
192
197
  f"No lock held by {holder} for transaction with key {key}"
@@ -61,10 +61,16 @@ class LockManager(Protocol):
61
61
  """
62
62
  Releases the lock on the corresponding transaction record.
63
63
 
64
+ If the lock no longer exists (e.g. it expired or was already released),
65
+ this method is a no-op.
66
+
64
67
  Args:
65
68
  key: Unique identifier for the transaction record.
66
69
  holder: Unique identifier for the holder of the lock. Must match the
67
70
  holder provided when acquiring the lock.
71
+
72
+ Raises:
73
+ ValueError: If the lock is held by a different holder.
68
74
  """
69
75
  ...
70
76
 
@@ -142,6 +142,8 @@ These validations exist to prevent git argument injection. Do not bypass them wh
142
142
 
143
143
  **Automatic dependency installation:** By default, `WorkspaceResolvingEngineCommandStarter` does not install dependencies before starting a flow run. When no explicit command is passed and `PREFECT_RUNNER_AUTO_INSTALL_DEPENDENCIES` is true, it auto-selects `uv run --no-default-groups --project <project_root>` with the worker-supplied workspace bootstrap — but only when all three conditions hold: `pyproject.toml` exists at `project_root`, the `project.dependencies` list includes `prefect`, and `uv` is found via the workspace's `PATH` env var (not the system PATH). The bootstrap uses the prepared entrypoint with `prefect.flow_engine` when that module exposes its executable `_main`; older selected runtimes fall back to `prefect.engine` with `PREFECT__FLOW_ENTRYPOINT`, preserving the prepared workspace. If the setting is false or any condition fails, the command falls back to `None`. Explicit commands always take precedence.
144
144
 
145
+ **Version skew in the runtime bootstrap:** `_workspace_runtime_bootstrap.py` runs inside the flow's selected runtime, which may ship an older Prefect than the worker. Do not make it depend on Prefect internals newer than that runtime; it keeps local copies instead. Its flow hook argument resolution is one such copy (see the hook-parity contract in `src/prefect/AGENTS.md`).
146
+
145
147
  ## Reference
146
148
 
147
149
  Full refactor design and rationale: plans/completed/2026-02-18-runner-refactor.md
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING, Any, Awaitable, Callable, Protocol
4
4
 
5
5
  from prefect._internal.concurrency.api import create_call, from_async
6
- from prefect._internal.engine import get_hook_name
6
+ from prefect._internal.engine import get_hook_name, resolve_flow_hook_arguments
7
7
  from prefect.logging.loggers import flow_run_logger
8
8
  from prefect.utilities.asyncutils import is_async_fn
9
9
 
@@ -35,12 +35,11 @@ async def _run_hooks(
35
35
  hook_name,
36
36
  state.name,
37
37
  )
38
+ args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
38
39
  if is_async_fn(hook):
39
- await hook(flow=flow, flow_run=flow_run, state=state)
40
+ await hook(*args, **kwargs)
40
41
  else:
41
- await from_async.call_in_new_thread(
42
- create_call(hook, flow=flow, flow_run=flow_run, state=state)
43
- )
42
+ await from_async.call_in_new_thread(create_call(hook, *args, **kwargs))
44
43
  except Exception:
45
44
  logger.error(
46
45
  "An error was encountered while running hook %r",
@@ -109,6 +109,52 @@ async def _load_flow(manifest: dict[str, Any]) -> Flow[Any, Any]:
109
109
  return await _run_sync(load_function_and_convert_to_flow, entrypoint)
110
110
 
111
111
 
112
+ def _flow_hook_arguments(
113
+ hook: Callable[..., Any],
114
+ flow: Flow[Any, Any],
115
+ flow_run: FlowRun,
116
+ state: State,
117
+ ) -> tuple[tuple[Any, ...], dict[str, Any]]:
118
+ # Same rule as `prefect._internal.engine.resolve_flow_hook_arguments`. This
119
+ # module runs with the flow's runtime, which may have an older Prefect
120
+ # without that function, so it keeps its own copy.
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
+ hook_name = getattr(hook, "__name__", type(hook).__name__)
151
+ raise TypeError(
152
+ f"Hook {hook_name!r} must accept the flow, the flow run and the state as"
153
+ " three positional arguments or as parameters named `flow`, `flow_run`"
154
+ " (or `run`) and `state`"
155
+ )
156
+
157
+
112
158
  async def _run_hooks(
113
159
  hooks: list[Callable[..., Any]],
114
160
  flow_run: FlowRun,
@@ -121,14 +167,8 @@ async def _run_hooks(
121
167
  for hook in hooks:
122
168
  hook_name = getattr(hook, "__name__", type(hook).__name__)
123
169
  try:
124
- result = await _run_sync(
125
- functools.partial(
126
- hook,
127
- flow=flow,
128
- flow_run=flow_run,
129
- state=state,
130
- )
131
- )
170
+ args, kwargs = _flow_hook_arguments(hook, flow, flow_run, state)
171
+ result = await _run_sync(functools.partial(hook, *args, **kwargs))
132
172
  if inspect.isawaitable(result):
133
173
  await result
134
174
  except Exception:
@@ -459,12 +459,27 @@ class GitRepository:
459
459
  # read-only attribute first to avoid `[WinError 5] Access is denied`.
460
460
  _clear_read_only_attributes(git_dir)
461
461
 
462
- # Sparsely checkout the repository if directories are specified and the repo is not in sparse-checkout mode already
463
- if self._directories and not await self.is_sparsely_checked_out():
462
+ # Make the checkout match the configured directories. The destination
463
+ # can be reused by runs whose `directories` differ (a redeploy that
464
+ # changed the list, or deployments sharing a working directory), so
465
+ # an existing sparse checkout only grows: narrowing it would remove
466
+ # files that another run may still be using.
467
+ is_sparse = await self.is_sparsely_checked_out()
468
+ if self._directories:
464
469
  await run_process(
465
- ["git", "sparse-checkout", "set", "--", *self._directories],
470
+ [
471
+ "git",
472
+ "sparse-checkout",
473
+ "add" if is_sparse else "set",
474
+ "--",
475
+ *self._directories,
476
+ ],
466
477
  cwd=self.destination,
467
478
  )
479
+ elif is_sparse:
480
+ await run_process(
481
+ ["git", "sparse-checkout", "disable"], cwd=self.destination
482
+ )
468
483
 
469
484
  self._logger.debug("Pulling latest changes from origin/%s", self._branch)
470
485
  # Update the existing repository
@@ -440,6 +440,9 @@ async def update_deployment(
440
440
  # Phase 2: Apply the actual updates. Renamed schedules use
441
441
  # their row ID (slug is now NULL); others use slug as before.
442
442
  for schedule in schedules_to_patch:
443
+ # A schedule sent with the deployment carries its full overrides, and
444
+ # `prefect deploy` leaves `parameters` out when there are none
445
+ schedule = schedule.model_copy(update={"parameters": schedule.parameters})
443
446
  if schedule.replaces:
444
447
  await models.deployments.update_deployment_schedule(
445
448
  session=session,
@@ -581,7 +581,9 @@ async def resume_flow_run(
581
581
  flow_run_input=schemas.core.FlowRunInput(
582
582
  flow_run_id=flow_run_id,
583
583
  key=keyset["response"],
584
- value=orjson.dumps(run_input).decode("utf-8"),
584
+ value=pydantic_core.to_json(run_input, inf_nan_mode="null").decode(
585
+ "utf-8"
586
+ ),
585
587
  ),
586
588
  )
587
589
 
@@ -367,9 +367,12 @@ def is_client_retryable_exception(exc: Exception) -> bool:
367
367
  exc,
368
368
  (
369
369
  sqlalchemy.exc.DBAPIError,
370
+ sqlalchemy.exc.TimeoutError,
371
+ TimeoutError,
370
372
  asyncpg.exceptions.QueryCanceledError,
371
373
  asyncpg.exceptions.ConnectionDoesNotExistError,
372
374
  asyncpg.exceptions.CannotConnectNowError,
375
+ asyncpg.exceptions.PostgresConnectionError,
373
376
  sqlalchemy.exc.InvalidRequestError,
374
377
  sqlalchemy.orm.exc.DetachedInstanceError,
375
378
  ),