prefect-client 3.7.2.dev2__tar.gz → 3.7.2.dev3__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 (447) hide show
  1. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/PKG-INFO +1 -1
  2. prefect_client-3.7.2.dev3/src/prefect/_build_info.py +5 -0
  3. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/automations.py +2 -0
  4. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/bundles/_zip_builder.py +32 -25
  5. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/__init__.py +2 -0
  6. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/actions.py +7 -0
  7. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/clients.py +3 -0
  8. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/workers.py +412 -14
  9. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/templating/__init__.py +25 -4
  10. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/_worker_channel/_protocol.py +4 -0
  11. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/_worker_channel/_sync.py +15 -8
  12. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/base.py +1 -3
  13. prefect_client-3.7.2.dev2/src/prefect/_build_info.py +0 -5
  14. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/.gitignore +0 -0
  15. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/LICENSE +0 -0
  16. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/README.md +0 -0
  17. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/hatch_build.py +0 -0
  18. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/pyproject.toml +0 -0
  19. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/.prefectignore +0 -0
  20. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/AGENTS.md +0 -0
  21. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/__init__.py +0 -0
  22. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/__main__.py +0 -0
  23. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/__init__.py +0 -0
  24. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/_launchers.py +0 -0
  25. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/bundles/__init__.py +0 -0
  26. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/bundles/execute.py +0 -0
  27. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/plugins/__init__.py +0 -0
  28. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/plugins/apply.py +0 -0
  29. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  30. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/plugins/manager.py +0 -0
  31. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/plugins/spec.py +0 -0
  32. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/sla/__init__.py +0 -0
  33. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/sla/client.py +0 -0
  34. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_experimental/sla/objects.py +0 -0
  35. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_flow_run_suspension.py +0 -0
  36. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/__init__.py +0 -0
  37. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/_logging.py +0 -0
  38. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/__init__.py +0 -0
  39. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  40. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/client.py +0 -0
  41. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/device_id.py +0 -0
  42. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/emit.py +0 -0
  43. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/enabled.py +0 -0
  44. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/events.py +0 -0
  45. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/milestones.py +0 -0
  46. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/notice.py +0 -0
  47. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/analytics/service.py +0 -0
  48. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/ast_utils.py +0 -0
  49. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/buildx.py +0 -0
  50. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/compatibility/__init__.py +0 -0
  51. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  52. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/compatibility/backports.py +0 -0
  53. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/compatibility/blocks.py +0 -0
  54. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  55. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  56. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/compatibility/migration.py +0 -0
  57. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/compatibility/starlette.py +0 -0
  58. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/__init__.py +0 -0
  59. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/api.py +0 -0
  60. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/calls.py +0 -0
  61. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  62. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  63. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/inspection.py +0 -0
  64. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/primitives.py +0 -0
  65. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/services.py +0 -0
  66. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/threads.py +0 -0
  67. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/concurrency/waiters.py +0 -0
  68. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/control_listener.py +0 -0
  69. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/deprecated.py +0 -0
  70. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/engine.py +0 -0
  71. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/git.py +0 -0
  72. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  73. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/installation.py +0 -0
  74. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/integrations.py +0 -0
  75. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/launchers.py +0 -0
  76. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/lazy.py +0 -0
  77. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/metrics.py +0 -0
  78. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/observability.py +0 -0
  79. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/observers.py +0 -0
  80. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/plugins/__init__.py +0 -0
  81. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/plugins/apply.py +0 -0
  82. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/plugins/collections.py +0 -0
  83. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  84. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/plugins/manager.py +0 -0
  85. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/plugins/spec.py +0 -0
  86. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/plugins/startup.py +0 -0
  87. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/pydantic/__init__.py +0 -0
  88. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/pydantic/schemas.py +0 -0
  89. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  90. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  91. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  92. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/pytz.py +0 -0
  93. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/result_records.py +0 -0
  94. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/retries.py +0 -0
  95. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/schema.py +0 -0
  96. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/schemas/__init__.py +0 -0
  97. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/schemas/bases.py +0 -0
  98. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/schemas/fields.py +0 -0
  99. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/schemas/serializers.py +0 -0
  100. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/schemas/validators.py +0 -0
  101. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  102. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/states.py +0 -0
  103. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/testing.py +0 -0
  104. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/urls.py +0 -0
  105. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/uuid7.py +0 -0
  106. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/version_checking.py +0 -0
  107. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/versioning.py +0 -0
  108. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/waiters.py +0 -0
  109. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_internal/websockets.py +0 -0
  110. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/__init__.py +0 -0
  111. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/fetcher.py +0 -0
  112. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/generator.py +0 -0
  113. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/models.py +0 -0
  114. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/naming.py +0 -0
  115. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/renderer.py +0 -0
  116. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/schema_converter.py +0 -0
  117. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/templates/__init__.py +0 -0
  118. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  119. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/types.py +0 -0
  120. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_sdk/unions.py +0 -0
  121. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_vendor/croniter/__init__.py +0 -0
  122. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/_vendor/croniter/croniter.py +0 -0
  123. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/agent.py +0 -0
  124. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/analytics/__init__.py +0 -0
  125. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/artifacts.py +0 -0
  126. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/assets/__init__.py +0 -0
  127. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/assets/core.py +0 -0
  128. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/assets/materialize.py +0 -0
  129. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/AGENTS.md +0 -0
  130. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/__init__.py +0 -0
  131. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/abstract.py +0 -0
  132. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/core.py +0 -0
  133. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/fields.py +0 -0
  134. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/notifications.py +0 -0
  135. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/redis.py +0 -0
  136. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/system.py +0 -0
  137. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/blocks/webhook.py +0 -0
  138. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/bundles/__init__.py +0 -0
  139. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/bundles/_file_collector.py +0 -0
  140. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/bundles/_ignore_filter.py +0 -0
  141. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/bundles/_path_resolver.py +0 -0
  142. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/bundles/_zip_extractor.py +0 -0
  143. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/bundles/execute.py +0 -0
  144. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/cache_policies.py +0 -0
  145. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/AGENTS.md +0 -0
  146. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/__init__.py +0 -0
  147. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/attribution.py +0 -0
  148. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/base.py +0 -0
  149. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/cloud.py +0 -0
  150. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/collections.py +0 -0
  151. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/constants.py +0 -0
  152. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/__init__.py +0 -0
  153. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  154. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  155. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  156. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_automations/client.py +0 -0
  157. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  158. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  159. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  160. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  161. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  162. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  163. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  164. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  165. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  166. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  167. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  168. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_events/client.py +0 -0
  169. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  170. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  171. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  172. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_flows/client.py +0 -0
  173. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  174. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_logs/client.py +0 -0
  175. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  176. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_variables/client.py +0 -0
  177. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  178. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  179. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/base.py +0 -0
  180. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/orchestration/routes.py +0 -0
  181. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/__init__.py +0 -0
  182. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/actions.py +0 -0
  183. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/events.py +0 -0
  184. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/filters.py +0 -0
  185. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/objects.py +0 -0
  186. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/responses.py +0 -0
  187. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/schedules.py +0 -0
  188. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/sorting.py +0 -0
  189. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/schemas/worker_channel.py +0 -0
  190. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/subscriptions.py +0 -0
  191. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/types/__init__.py +0 -0
  192. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  193. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/client/utilities.py +0 -0
  194. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/AGENTS.md +0 -0
  195. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/__init__.py +0 -0
  196. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/_asyncio.py +0 -0
  197. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/_events.py +0 -0
  198. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/_leases.py +0 -0
  199. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/_sync.py +0 -0
  200. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/asyncio.py +0 -0
  201. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/context.py +0 -0
  202. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/services.py +0 -0
  203. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/sync.py +0 -0
  204. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/v1/__init__.py +0 -0
  205. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  206. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/v1/_events.py +0 -0
  207. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/v1/asyncio.py +0 -0
  208. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/v1/context.py +0 -0
  209. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/v1/services.py +0 -0
  210. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/concurrency/v1/sync.py +0 -0
  211. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/context.py +0 -0
  212. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/AGENTS.md +0 -0
  213. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/__init__.py +0 -0
  214. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/base.py +0 -0
  215. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/deployments.py +0 -0
  216. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/flow_runs.py +0 -0
  217. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/runner.py +0 -0
  218. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/schedules.py +0 -0
  219. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/steps/__init__.py +0 -0
  220. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/steps/core.py +0 -0
  221. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/steps/pull.py +0 -0
  222. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/deployments/steps/utility.py +0 -0
  223. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/docker/__init__.py +0 -0
  224. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/docker/_buildx.py +0 -0
  225. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/docker/docker_image.py +0 -0
  226. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/engine.py +0 -0
  227. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/AGENTS.md +0 -0
  228. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/clients.py +0 -0
  229. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/filters.py +0 -0
  230. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/related.py +0 -0
  231. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/schemas/__init__.py +0 -0
  232. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/schemas/automations.py +0 -0
  233. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  234. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/schemas/events.py +0 -0
  235. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/schemas/labelling.py +0 -0
  236. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/subscribers.py +0 -0
  237. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/utilities.py +0 -0
  238. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/events/worker.py +0 -0
  239. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/exceptions.py +0 -0
  240. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/filesystems.py +0 -0
  241. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/flow_engine.py +0 -0
  242. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/flow_runs.py +0 -0
  243. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/flows.py +0 -0
  244. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/futures.py +0 -0
  245. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/infrastructure/__init__.py +0 -0
  246. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/infrastructure/base.py +0 -0
  247. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  248. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  249. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  250. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  251. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  252. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  253. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/input/__init__.py +0 -0
  254. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/input/actions.py +0 -0
  255. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/input/run_input.py +0 -0
  256. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/locking/__init__.py +0 -0
  257. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/locking/_filelock.py +0 -0
  258. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/locking/filesystem.py +0 -0
  259. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/locking/memory.py +0 -0
  260. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/locking/protocol.py +0 -0
  261. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/AGENTS.md +0 -0
  262. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/__init__.py +0 -0
  263. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/clients.py +0 -0
  264. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/configuration.py +0 -0
  265. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/filters.py +0 -0
  266. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/formatters.py +0 -0
  267. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/handlers.py +0 -0
  268. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/highlighters.py +0 -0
  269. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/loggers.py +0 -0
  270. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/logging/logging.yml +0 -0
  271. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/main.py +0 -0
  272. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/plugins.py +0 -0
  273. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/py.typed +0 -0
  274. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/results.py +0 -0
  275. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/AGENTS.md +0 -0
  276. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/__init__.py +0 -0
  277. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_cancel_finalizer.py +0 -0
  278. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_cancellation_manager.py +0 -0
  279. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_control_channel.py +0 -0
  280. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_deployment_registry.py +0 -0
  281. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_event_emitter.py +0 -0
  282. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_flow_resolver.py +0 -0
  283. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_flow_run_executor.py +0 -0
  284. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_hook_runner.py +0 -0
  285. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_limit_manager.py +0 -0
  286. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_process_manager.py +0 -0
  287. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  288. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_starter_bundle.py +0 -0
  289. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_starter_direct.py +0 -0
  290. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_starter_engine.py +0 -0
  291. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_state_proposer.py +0 -0
  292. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_workspace_resolver.py +0 -0
  293. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/_workspace_starter.py +0 -0
  294. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/runner.py +0 -0
  295. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/server.py +0 -0
  296. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runner/storage.py +0 -0
  297. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runtime/__init__.py +0 -0
  298. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runtime/deployment.py +0 -0
  299. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runtime/flow_run.py +0 -0
  300. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/runtime/task_run.py +0 -0
  301. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/schedules.py +0 -0
  302. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/serializers.py +0 -0
  303. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/__init__.py +0 -0
  304. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/admin.py +0 -0
  305. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/artifacts.py +0 -0
  306. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/automations.py +0 -0
  307. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/background_workers.py +0 -0
  308. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/block_capabilities.py +0 -0
  309. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/block_documents.py +0 -0
  310. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/block_schemas.py +0 -0
  311. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/block_types.py +0 -0
  312. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/collections.py +0 -0
  313. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  314. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/concurrency_limits.py +0 -0
  315. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  316. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/csrf_token.py +0 -0
  317. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/dependencies.py +0 -0
  318. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/deployments.py +0 -0
  319. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/events.py +0 -0
  320. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/flow_run_states.py +0 -0
  321. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/flow_runs.py +0 -0
  322. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/flows.py +0 -0
  323. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/logs.py +0 -0
  324. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/middleware.py +0 -0
  325. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/root.py +0 -0
  326. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/run_history.py +0 -0
  327. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/saved_searches.py +0 -0
  328. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/server.py +0 -0
  329. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  330. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/task_run_states.py +0 -0
  331. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/task_runs.py +0 -0
  332. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/task_workers.py +0 -0
  333. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/templates.py +0 -0
  334. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/ui/__init__.py +0 -0
  335. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/ui/flow_runs.py +0 -0
  336. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/ui/flows.py +0 -0
  337. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/ui/schemas.py +0 -0
  338. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/ui/task_runs.py +0 -0
  339. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/validation.py +0 -0
  340. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/variables.py +0 -0
  341. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/server/api/work_queues.py +0 -0
  342. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/AGENTS.md +0 -0
  343. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/__init__.py +0 -0
  344. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/base.py +0 -0
  345. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/constants.py +0 -0
  346. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/context.py +0 -0
  347. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/legacy.py +0 -0
  348. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/__init__.py +0 -0
  349. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/_defaults.py +0 -0
  350. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/api.py +0 -0
  351. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/cli.py +0 -0
  352. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/client.py +0 -0
  353. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/cloud.py +0 -0
  354. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/deployments.py +0 -0
  355. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/events.py +0 -0
  356. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/experiments.py +0 -0
  357. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/flows.py +0 -0
  358. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/internal.py +0 -0
  359. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/logging.py +0 -0
  360. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/plugins.py +0 -0
  361. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/results.py +0 -0
  362. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/root.py +0 -0
  363. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/runner.py +0 -0
  364. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/__init__.py +0 -0
  365. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/api.py +0 -0
  366. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/concurrency.py +0 -0
  367. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/database.py +0 -0
  368. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/deployments.py +0 -0
  369. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/docket.py +0 -0
  370. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/ephemeral.py +0 -0
  371. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/events.py +0 -0
  372. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  373. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/logs.py +0 -0
  374. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/root.py +0 -0
  375. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/services.py +0 -0
  376. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/tasks.py +0 -0
  377. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/server/ui.py +0 -0
  378. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/tasks.py +0 -0
  379. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/telemetry.py +0 -0
  380. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/testing.py +0 -0
  381. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/models/worker.py +0 -0
  382. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/profiles.py +0 -0
  383. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/profiles.toml +0 -0
  384. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/settings/sources.py +0 -0
  385. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/states.py +0 -0
  386. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/task_engine.py +0 -0
  387. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/task_runners.py +0 -0
  388. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/task_runs.py +0 -0
  389. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/task_worker.py +0 -0
  390. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/tasks.py +0 -0
  391. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/telemetry/__init__.py +0 -0
  392. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/telemetry/run_telemetry.py +0 -0
  393. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/transactions.py +0 -0
  394. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/types/__init__.py +0 -0
  395. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/types/_concurrency.py +0 -0
  396. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/types/_datetime.py +0 -0
  397. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/types/entrypoint.py +0 -0
  398. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/types/names.py +0 -0
  399. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/AGENTS.md +0 -0
  400. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/__init__.py +0 -0
  401. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/annotations.py +0 -0
  402. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  403. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  404. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/callables/AGENTS.md +0 -0
  405. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/callables/__init__.py +0 -0
  406. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/collections.py +0 -0
  407. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/compat.py +0 -0
  408. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/context.py +0 -0
  409. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/dispatch.py +0 -0
  410. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/dockerutils.py +0 -0
  411. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/engine/AGENTS.md +0 -0
  412. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/engine/__init__.py +0 -0
  413. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  414. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/filesystem/__init__.py +0 -0
  415. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/generics.py +0 -0
  416. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/hashing.py +0 -0
  417. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/importtools.py +0 -0
  418. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/math.py +0 -0
  419. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/names.py +0 -0
  420. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  421. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/processutils/__init__.py +0 -0
  422. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/pydantic.py +0 -0
  423. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/render_swagger.py +0 -0
  424. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  425. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  426. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  427. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/schema_tools/validation.py +0 -0
  428. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/services.py +0 -0
  429. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/slugify.py +0 -0
  430. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/templating/AGENTS.md +0 -0
  431. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/text.py +0 -0
  432. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/timeout.py +0 -0
  433. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/urls.py +0 -0
  434. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/utilities/visualization.py +0 -0
  435. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/variables.py +0 -0
  436. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/AGENTS.md +0 -0
  437. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/__init__.py +0 -0
  438. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/_cleanup.py +0 -0
  439. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/_cleanup_handlers.py +0 -0
  440. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  441. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/_worker_channel/_state.py +0 -0
  442. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  443. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/block.py +0 -0
  444. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/cloud.py +0 -0
  445. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/process.py +0 -0
  446. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/server.py +0 -0
  447. {prefect_client-3.7.2.dev2 → prefect_client-3.7.2.dev3}/src/prefect/workers/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect-client
3
- Version: 3.7.2.dev2
3
+ Version: 3.7.2.dev3
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.7.2.dev3"
3
+ __build_date__ = "2026-05-20 09:16:00.764815+00:00"
4
+ __git_commit__ = "30ca141845030af77328e2ebe495e200db2fc679"
5
+ __dirty__ = False
@@ -11,6 +11,7 @@ from prefect.events.actions import (
11
11
  CancelFlowRun,
12
12
  ChangeFlowRunState,
13
13
  DeclareIncident,
14
+ DeleteFlowRun,
14
15
  DoNothing,
15
16
  PauseAutomation,
16
17
  PauseDeployment,
@@ -61,6 +62,7 @@ __all__ = [
61
62
  "PauseDeployment",
62
63
  "ResumeDeployment",
63
64
  "CancelFlowRun",
65
+ "DeleteFlowRun",
64
66
  "ChangeFlowRunState",
65
67
  "PauseWorkQueue",
66
68
  "ResumeWorkQueue",
@@ -11,6 +11,7 @@ from __future__ import annotations
11
11
  import hashlib
12
12
  import logging
13
13
  import shutil
14
+ import struct
14
15
  import tempfile
15
16
  import zipfile
16
17
  from dataclasses import dataclass
@@ -32,7 +33,8 @@ class ZipResult:
32
33
 
33
34
  Attributes:
34
35
  zip_path: Path to the temporary zip file.
35
- sha256_hash: Lowercase hex digest of the zip content.
36
+ sha256_hash: SHA256 hex digest of the canonical bundled file contents
37
+ (paths, modes, and bytes), not the raw zip archive bytes.
36
38
  storage_key: Content-addressed storage key in format "files/{hash}.zip".
37
39
  size_bytes: Size of the zip file in bytes.
38
40
  """
@@ -95,16 +97,40 @@ class ZipBuilder:
95
97
  self._temp_dir = tempfile.mkdtemp(prefix="prefect-zip-")
96
98
  zip_path = Path(self._temp_dir) / "files.zip"
97
99
 
98
- # Build the zip with DEFLATED compression
100
+ # Build the zip and compute the content hash in a single pass so
101
+ # that every file is read exactly once, avoiding race conditions
102
+ # where a source file could change between the zip write and the
103
+ # hash computation.
104
+ hasher = hashlib.sha256()
105
+ hasher.update(b"prefect-bundle-files-v1\0")
106
+
99
107
  with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as zf:
100
108
  for file_path in sorted_files:
101
- # Compute relative path with forward slashes
102
109
  rel_path = file_path.relative_to(self.base_dir)
103
110
  arcname = str(rel_path).replace("\\", "/")
104
- zf.write(file_path, arcname)
105
111
 
106
- # Compute SHA256 hash using chunked reading
107
- sha256_hash = self._compute_hash(zip_path)
112
+ file_stat = file_path.stat()
113
+
114
+ arcname_bytes = arcname.encode("utf-8")
115
+ hasher.update(struct.pack(">I", len(arcname_bytes)))
116
+ hasher.update(arcname_bytes)
117
+ hasher.update(struct.pack(">I", file_stat.st_mode & 0xFFFF))
118
+ hasher.update(struct.pack(">Q", file_stat.st_size))
119
+
120
+ zip_info = zipfile.ZipInfo.from_file(file_path, arcname)
121
+ zip_info.compress_type = zipfile.ZIP_DEFLATED
122
+ with (
123
+ file_path.open("rb") as src,
124
+ zf.open(zip_info, "w") as dest,
125
+ ):
126
+ while True:
127
+ chunk = src.read(HASH_CHUNK_SIZE)
128
+ if not chunk:
129
+ break
130
+ dest.write(chunk)
131
+ hasher.update(chunk)
132
+
133
+ sha256_hash = hasher.hexdigest()
108
134
 
109
135
  # Get file size
110
136
  size_bytes = zip_path.stat().st_size
@@ -123,25 +149,6 @@ class ZipBuilder:
123
149
  size_bytes=size_bytes,
124
150
  )
125
151
 
126
- def _compute_hash(self, zip_path: Path) -> str:
127
- """
128
- Compute SHA256 hash of a file using chunked reading.
129
-
130
- Args:
131
- zip_path: Path to the file to hash.
132
-
133
- Returns:
134
- Lowercase hex digest of the SHA256 hash.
135
- """
136
- hasher = hashlib.sha256()
137
- with open(zip_path, "rb") as f:
138
- while True:
139
- chunk = f.read(HASH_CHUNK_SIZE)
140
- if not chunk:
141
- break
142
- hasher.update(chunk)
143
- return hasher.hexdigest()
144
-
145
152
  def _emit_size_warning(
146
153
  self, zip_path: Path, files: list[Path], size_bytes: int
147
154
  ) -> None:
@@ -31,6 +31,7 @@ from .actions import (
31
31
  ResumeDeployment,
32
32
  ChangeFlowRunState,
33
33
  CancelFlowRun,
34
+ DeleteFlowRun,
34
35
  SuspendFlowRun,
35
36
  CallWebhook,
36
37
  SendNotification,
@@ -78,6 +79,7 @@ __all__ = [
78
79
  "ResumeDeployment",
79
80
  "ChangeFlowRunState",
80
81
  "CancelFlowRun",
82
+ "DeleteFlowRun",
81
83
  "SuspendFlowRun",
82
84
  "CallWebhook",
83
85
  "SendNotification",
@@ -126,6 +126,12 @@ class CancelFlowRun(Action):
126
126
  type: Literal["cancel-flow-run"] = "cancel-flow-run"
127
127
 
128
128
 
129
+ class DeleteFlowRun(Action):
130
+ """Deletes a flow run associated with the trigger"""
131
+
132
+ type: Literal["delete-flow-run"] = "delete-flow-run"
133
+
134
+
129
135
  class ResumeFlowRun(Action):
130
136
  """Resumes a flow run associated with the trigger"""
131
137
 
@@ -294,6 +300,7 @@ ActionTypes: TypeAlias = Union[
294
300
  ResumeDeployment,
295
301
  ResumeFlowRun,
296
302
  CancelFlowRun,
303
+ DeleteFlowRun,
297
304
  ChangeFlowRunState,
298
305
  PauseWorkQueue,
299
306
  ResumeWorkQueue,
@@ -93,6 +93,9 @@ class OrchestrationClient(BaseClient):
93
93
  async def read_flow_run_raw(self, flow_run_id: UUID) -> Response:
94
94
  return await self._http_client.get(f"/flow_runs/{flow_run_id}")
95
95
 
96
+ async def delete_flow_run(self, flow_run_id: UUID) -> Response:
97
+ return await self._http_client.delete(f"/flow_runs/{flow_run_id}")
98
+
96
99
  async def read_task_run_raw(self, task_run_id: UUID) -> Response:
97
100
  return await self._http_client.get(f"/task_runs/{task_run_id}")
98
101
 
@@ -2,7 +2,9 @@
2
2
  Routes for interacting with work queue objects.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING, List, Optional
5
+ from dataclasses import dataclass
6
+ from logging import Logger
7
+ from typing import TYPE_CHECKING, Any, List, Optional
6
8
  from uuid import UUID
7
9
 
8
10
  import sqlalchemy as sa
@@ -11,15 +13,32 @@ from fastapi import (
11
13
  Depends,
12
14
  HTTPException,
13
15
  Path,
16
+ WebSocket,
14
17
  status,
15
18
  )
16
19
  from packaging.version import Version
20
+ from pydantic import ValidationError
17
21
  from sqlalchemy.ext.asyncio import AsyncSession
18
22
 
19
23
  import prefect.server.api.dependencies as dependencies
20
24
  import prefect.server.models as models
21
25
  import prefect.server.schemas as schemas
22
26
  from prefect._internal.uuid7 import uuid7
27
+ from prefect.client.schemas.worker_channel import (
28
+ WORK_POOL_SNAPSHOT_CAPABILITY,
29
+ WORKER_CHANNEL_CLOSE_POLICIES,
30
+ WORKER_HEARTBEAT_CAPABILITY,
31
+ WorkerChannelCloseReason,
32
+ WorkerChannelProtocolError,
33
+ WorkerHeartbeatFrame,
34
+ WorkerHelloFrame,
35
+ WorkerReadyFrame,
36
+ WorkPoolSnapshot,
37
+ WorkPoolSnapshotPayload,
38
+ select_worker_channel_version,
39
+ validate_worker_channel_frame,
40
+ )
41
+ from prefect.logging import get_logger
23
42
  from prefect.server.api.validation import validate_job_variable_defaults_for_work_pool
24
43
  from prefect.server.database import PrefectDBInterface, provide_database_interface
25
44
  from prefect.server.models.deployments import mark_deployments_ready
@@ -29,17 +48,25 @@ from prefect.server.models.work_queues import (
29
48
  )
30
49
  from prefect.server.models.workers import emit_work_pool_status_event
31
50
  from prefect.server.schemas.statuses import WorkQueueStatus
51
+ from prefect.server.utilities import subscriptions
32
52
  from prefect.server.utilities.server import PrefectRouter
33
53
  from prefect.types import DateTime
34
54
  from prefect.types._datetime import now
35
55
 
36
56
  if TYPE_CHECKING:
37
- from prefect.server.database.orm_models import ORMWorkQueue
57
+ from prefect.server.database.orm_models import WorkPool as ORMWorkPool
58
+ from prefect.server.database.orm_models import WorkQueue as ORMWorkQueue
38
59
 
39
60
  router: PrefectRouter = PrefectRouter(
40
61
  prefix="/work_pools",
41
62
  tags=["Work Pools"],
42
63
  )
64
+ logger: Logger = get_logger("prefect.server.api.workers")
65
+
66
+ _OSS_WORKER_CHANNEL_ACCEPTED_CAPABILITIES = [
67
+ WORKER_HEARTBEAT_CAPABILITY,
68
+ WORK_POOL_SNAPSHOT_CAPABILITY,
69
+ ]
43
70
 
44
71
 
45
72
  # -----------------------------------------------------
@@ -145,6 +172,288 @@ class WorkerLookups:
145
172
  return queue.id
146
173
 
147
174
 
175
+ class WorkerChannelSetupError(Exception):
176
+ def __init__(self, close_reason: WorkerChannelCloseReason, detail: str):
177
+ super().__init__(detail)
178
+ self.close_reason = close_reason
179
+ self.detail = detail
180
+
181
+
182
+ @dataclass(frozen=True)
183
+ class WorkerChannelWorkPoolUpdateEvent:
184
+ work_pool_id: UUID
185
+ changed_fields: dict[str, dict[str, Any]]
186
+
187
+
188
+ async def _close_worker_channel(
189
+ websocket: WebSocket, close_reason: WorkerChannelCloseReason
190
+ ) -> None:
191
+ policy = WORKER_CHANNEL_CLOSE_POLICIES[close_reason]
192
+ await websocket.close(code=policy.websocket_code, reason=close_reason.value)
193
+
194
+
195
+ async def _receive_worker_hello(websocket: WebSocket) -> WorkerHelloFrame:
196
+ try:
197
+ message = await websocket.receive_json()
198
+ frame = validate_worker_channel_frame(message)
199
+ except ValidationError as exc:
200
+ raise WorkerChannelSetupError(
201
+ WorkerChannelCloseReason.PROTOCOL_ERROR,
202
+ "Worker channel received a malformed hello frame",
203
+ ) from exc
204
+ except ValueError as exc:
205
+ raise WorkerChannelSetupError(
206
+ WorkerChannelCloseReason.PROTOCOL_ERROR,
207
+ "Worker channel received invalid JSON during setup",
208
+ ) from exc
209
+
210
+ if not isinstance(frame, WorkerHelloFrame):
211
+ raise WorkerChannelSetupError(
212
+ WorkerChannelCloseReason.PROTOCOL_ERROR,
213
+ "Expected worker.hello.v1 during worker channel setup",
214
+ )
215
+
216
+ return frame
217
+
218
+
219
+ async def _resolve_worker_channel_work_pool(
220
+ session: AsyncSession,
221
+ work_pool_name: str,
222
+ hello: WorkerHelloFrame,
223
+ ) -> "ORMWorkPool":
224
+ work_pool = await models.workers.read_work_pool_by_name(
225
+ session=session,
226
+ work_pool_name=work_pool_name,
227
+ )
228
+
229
+ default_base_job_template = hello.payload.default_base_job_template
230
+ if work_pool is None:
231
+ if not hello.payload.create_pool_if_not_found:
232
+ raise WorkerChannelSetupError(
233
+ WorkerChannelCloseReason.AUTHORIZATION_FAILED,
234
+ "work_pool_not_found",
235
+ )
236
+
237
+ if work_pool_name.lower().startswith("prefect"):
238
+ raise WorkerChannelSetupError(
239
+ WorkerChannelCloseReason.AUTHORIZATION_FAILED,
240
+ "work_pool_creation_unauthorized",
241
+ )
242
+
243
+ await validate_job_variable_defaults_for_work_pool(
244
+ session, work_pool_name, default_base_job_template
245
+ )
246
+ try:
247
+ async with session.begin_nested():
248
+ work_pool = await models.workers.create_work_pool(
249
+ session=session,
250
+ work_pool=schemas.actions.WorkPoolCreate(
251
+ name=work_pool_name,
252
+ type=hello.payload.worker_type,
253
+ base_job_template=default_base_job_template,
254
+ ),
255
+ )
256
+ except sa.exc.IntegrityError:
257
+ work_pool = await models.workers.read_work_pool_by_name(
258
+ session=session,
259
+ work_pool_name=work_pool_name,
260
+ )
261
+ if work_pool is None:
262
+ raise
263
+ return work_pool
264
+
265
+ return work_pool
266
+
267
+
268
+ async def _resolve_worker_channel_work_queues(
269
+ session: AsyncSession,
270
+ work_pool_id: UUID,
271
+ work_pool_name: str,
272
+ work_queue_names: list[str],
273
+ ) -> list["ORMWorkQueue"]:
274
+ if not work_queue_names:
275
+ return list(
276
+ await models.workers.read_work_queues(
277
+ session=session, work_pool_id=work_pool_id
278
+ )
279
+ )
280
+
281
+ work_queues = []
282
+ for work_queue_name in dict.fromkeys(work_queue_names):
283
+ work_queue = await models.workers.read_work_queue_by_name(
284
+ session=session,
285
+ work_pool_name=work_pool_name,
286
+ work_queue_name=work_queue_name,
287
+ )
288
+ if work_queue is None:
289
+ raise WorkerChannelSetupError(
290
+ WorkerChannelCloseReason.AUTHORIZATION_FAILED,
291
+ "work_queue_not_found",
292
+ )
293
+ work_queues.append(work_queue)
294
+
295
+ return work_queues
296
+
297
+
298
+ async def _build_worker_channel_work_pool_snapshot(
299
+ session: AsyncSession,
300
+ work_pool: "ORMWorkPool",
301
+ ) -> WorkPoolSnapshot:
302
+ work_pool_response = schemas.responses.WorkPoolResponse.model_validate(
303
+ work_pool, from_attributes=True
304
+ )
305
+
306
+ if work_pool_response.concurrency_limit is not None:
307
+ work_pool_response.active_slots = (
308
+ await models.workers.count_work_pool_active_slots(
309
+ session=session,
310
+ work_pool_id=work_pool.id,
311
+ )
312
+ )
313
+
314
+ return WorkPoolSnapshot.model_validate(work_pool_response.model_dump(mode="json"))
315
+
316
+
317
+ async def _build_worker_ready_frame(
318
+ session: AsyncSession,
319
+ work_pool_name: str,
320
+ hello: WorkerHelloFrame,
321
+ ) -> tuple[WorkerReadyFrame, WorkerChannelWorkPoolUpdateEvent | None]:
322
+ try:
323
+ selected_channel_version = select_worker_channel_version(
324
+ hello.payload.supported_channel_versions
325
+ )
326
+ except WorkerChannelProtocolError as exc:
327
+ raise WorkerChannelSetupError(exc.close_reason, str(exc)) from exc
328
+
329
+ work_pool = await _resolve_worker_channel_work_pool(
330
+ session=session,
331
+ work_pool_name=work_pool_name,
332
+ hello=hello,
333
+ )
334
+ work_queues = await _resolve_worker_channel_work_queues(
335
+ session=session,
336
+ work_pool_id=work_pool.id,
337
+ work_pool_name=work_pool_name,
338
+ work_queue_names=hello.payload.work_queue_names,
339
+ )
340
+ default_base_job_template = hello.payload.default_base_job_template
341
+ work_pool_update_event = None
342
+ if not work_pool.base_job_template and default_base_job_template:
343
+ previous_base_job_template = work_pool.base_job_template
344
+ await validate_job_variable_defaults_for_work_pool(
345
+ session, work_pool_name, default_base_job_template
346
+ )
347
+ updated = await models.workers.update_work_pool(
348
+ session=session,
349
+ work_pool_id=work_pool.id,
350
+ work_pool=schemas.actions.WorkPoolUpdate(
351
+ base_job_template=default_base_job_template
352
+ ),
353
+ emit_update_event=False,
354
+ emit_status_change=emit_work_pool_status_event,
355
+ )
356
+ if updated:
357
+ work_pool_update_event = WorkerChannelWorkPoolUpdateEvent(
358
+ work_pool_id=work_pool.id,
359
+ changed_fields={
360
+ "base_job_template": {
361
+ "from": previous_base_job_template,
362
+ "to": default_base_job_template,
363
+ }
364
+ },
365
+ )
366
+ refreshed = await models.workers.read_work_pool(
367
+ session=session, work_pool_id=work_pool.id
368
+ )
369
+ assert refreshed is not None
370
+ work_pool = refreshed
371
+
372
+ try:
373
+ worker = await models.workers.record_worker_heartbeat(
374
+ session=session,
375
+ work_pool=work_pool,
376
+ worker_name=hello.payload.worker_name,
377
+ heartbeat_interval_seconds=hello.payload.heartbeat_interval_seconds,
378
+ emit_status_change=emit_work_pool_status_event,
379
+ return_worker=True,
380
+ )
381
+ except Exception as exc:
382
+ raise WorkerChannelSetupError(
383
+ WorkerChannelCloseReason.HEARTBEAT_PERSISTENCE_FAILED,
384
+ "worker_channel_initial_heartbeat_failed",
385
+ ) from exc
386
+ assert worker is not None
387
+
388
+ refreshed_work_pool = await models.workers.read_work_pool(
389
+ session=session, work_pool_id=work_pool.id
390
+ )
391
+ assert refreshed_work_pool is not None
392
+ initial_snapshot = WorkPoolSnapshotPayload(
393
+ snapshot_sequence=1,
394
+ reason="initial",
395
+ work_pool=await _build_worker_channel_work_pool_snapshot(
396
+ session=session,
397
+ work_pool=refreshed_work_pool,
398
+ ),
399
+ )
400
+
401
+ requested_capabilities = list(dict.fromkeys(hello.payload.requested_capabilities))
402
+ accepted = _OSS_WORKER_CHANNEL_ACCEPTED_CAPABILITIES
403
+ accepted_set = set(accepted)
404
+ rejected = [
405
+ capability
406
+ for capability in requested_capabilities
407
+ if capability not in accepted_set
408
+ ]
409
+
410
+ return (
411
+ WorkerReadyFrame(
412
+ type="worker.ready.v1",
413
+ id=uuid7(),
414
+ sent_at=now("UTC"),
415
+ payload={
416
+ "consumer_id": hello.payload.consumer_id,
417
+ "worker_id": worker.id,
418
+ "selected_channel_version": selected_channel_version,
419
+ "effective_heartbeat_interval_seconds": (
420
+ hello.payload.heartbeat_interval_seconds
421
+ ),
422
+ "accepted_capabilities": accepted,
423
+ "rejected_capabilities": rejected,
424
+ "effective_max_cleanup_concurrency": 0,
425
+ "resolved_work_queues": [
426
+ {"id": work_queue.id, "name": work_queue.name}
427
+ for work_queue in work_queues
428
+ ],
429
+ "initial_snapshot": initial_snapshot,
430
+ },
431
+ ),
432
+ work_pool_update_event,
433
+ )
434
+
435
+
436
+ async def _persist_worker_channel_heartbeat(
437
+ session: AsyncSession,
438
+ work_pool_name: str,
439
+ frame: WorkerHeartbeatFrame,
440
+ ) -> None:
441
+ work_pool = await models.workers.read_work_pool_by_name(
442
+ session=session,
443
+ work_pool_name=work_pool_name,
444
+ )
445
+ if work_pool is None:
446
+ raise RuntimeError("Worker channel work pool no longer exists")
447
+
448
+ await models.workers.record_worker_heartbeat(
449
+ session=session,
450
+ work_pool=work_pool,
451
+ worker_name=frame.payload.worker_name,
452
+ heartbeat_interval_seconds=frame.payload.heartbeat_interval_seconds,
453
+ emit_status_change=emit_work_pool_status_event,
454
+ )
455
+
456
+
148
457
  # -----------------------------------------------------
149
458
  # --
150
459
  # --
@@ -756,6 +1065,104 @@ async def delete_work_queue(
756
1065
  # -----------------------------------------------------
757
1066
 
758
1067
 
1068
+ @router.websocket("/{work_pool_name}/workers/connect")
1069
+ async def worker_channel_connect(
1070
+ websocket: WebSocket,
1071
+ work_pool_name: str = Path(..., description="The work pool name"),
1072
+ db: PrefectDBInterface = Depends(provide_database_interface),
1073
+ ) -> None:
1074
+ websocket = await subscriptions.accept_prefect_socket(
1075
+ websocket,
1076
+ require_prefect_subprotocol=True,
1077
+ authentication_failed_reason=WorkerChannelCloseReason.AUTHENTICATION_FAILED.value,
1078
+ )
1079
+ if not websocket:
1080
+ return
1081
+
1082
+ try:
1083
+ hello = await _receive_worker_hello(websocket)
1084
+ async with db.session_context(begin_transaction=True) as session:
1085
+ ready, work_pool_update_event = await _build_worker_ready_frame(
1086
+ session=session,
1087
+ work_pool_name=work_pool_name,
1088
+ hello=hello,
1089
+ )
1090
+
1091
+ if work_pool_update_event is not None:
1092
+ async with db.session_context() as session:
1093
+ work_pool = await models.workers.read_work_pool(
1094
+ session=session,
1095
+ work_pool_id=work_pool_update_event.work_pool_id,
1096
+ )
1097
+ assert work_pool is not None
1098
+ await models.workers.emit_work_pool_updated_event(
1099
+ session=session,
1100
+ work_pool=work_pool,
1101
+ changed_fields=work_pool_update_event.changed_fields,
1102
+ )
1103
+
1104
+ await websocket.send_json(ready.model_dump(mode="json"))
1105
+
1106
+ while True:
1107
+ try:
1108
+ message = await websocket.receive_json()
1109
+ frame = validate_worker_channel_frame(message)
1110
+ except ValidationError:
1111
+ await _close_worker_channel(
1112
+ websocket, WorkerChannelCloseReason.PROTOCOL_ERROR
1113
+ )
1114
+ return
1115
+ except ValueError:
1116
+ await _close_worker_channel(
1117
+ websocket, WorkerChannelCloseReason.PROTOCOL_ERROR
1118
+ )
1119
+ return
1120
+
1121
+ if not isinstance(frame, WorkerHeartbeatFrame):
1122
+ await _close_worker_channel(
1123
+ websocket, WorkerChannelCloseReason.PROTOCOL_ERROR
1124
+ )
1125
+ return
1126
+
1127
+ if (
1128
+ frame.payload.consumer_id != hello.payload.consumer_id
1129
+ or frame.payload.worker_name != hello.payload.worker_name
1130
+ ):
1131
+ await _close_worker_channel(
1132
+ websocket, WorkerChannelCloseReason.PROTOCOL_ERROR
1133
+ )
1134
+ return
1135
+
1136
+ try:
1137
+ async with db.session_context(begin_transaction=True) as session:
1138
+ await _persist_worker_channel_heartbeat(
1139
+ session=session,
1140
+ work_pool_name=work_pool_name,
1141
+ frame=frame,
1142
+ )
1143
+ except Exception:
1144
+ logger.exception("Worker channel heartbeat persistence failed")
1145
+ await _close_worker_channel(
1146
+ websocket,
1147
+ WorkerChannelCloseReason.HEARTBEAT_PERSISTENCE_FAILED,
1148
+ )
1149
+ return
1150
+
1151
+ except WorkerChannelSetupError as exc:
1152
+ logger.info("Worker channel setup failed: %s", exc.detail)
1153
+ await _close_worker_channel(websocket, exc.close_reason)
1154
+ except HTTPException as exc:
1155
+ logger.info("Worker channel setup failed HTTP validation: %s", exc.detail)
1156
+ await _close_worker_channel(websocket, WorkerChannelCloseReason.PROTOCOL_ERROR)
1157
+ except subscriptions.NORMAL_DISCONNECT_EXCEPTIONS:
1158
+ return
1159
+ except Exception:
1160
+ logger.exception("Worker channel setup failed due to a transient server error")
1161
+ await _close_worker_channel(
1162
+ websocket, WorkerChannelCloseReason.TRANSIENT_SERVER_ERROR
1163
+ )
1164
+
1165
+
759
1166
  @router.post(
760
1167
  "/{work_pool_name}/workers/heartbeat",
761
1168
  status_code=status.HTTP_204_NO_CONTENT,
@@ -780,23 +1187,14 @@ async def worker_heartbeat(
780
1187
  detail=f'Work pool "{work_pool_name}" not found.',
781
1188
  )
782
1189
 
783
- await models.workers.worker_heartbeat(
1190
+ await models.workers.record_worker_heartbeat(
784
1191
  session=session,
785
- work_pool_id=work_pool.id,
1192
+ work_pool=work_pool,
786
1193
  worker_name=name,
787
1194
  heartbeat_interval_seconds=heartbeat_interval_seconds,
1195
+ emit_status_change=emit_work_pool_status_event,
788
1196
  )
789
1197
 
790
- if work_pool.status == schemas.statuses.WorkPoolStatus.NOT_READY:
791
- await models.workers.update_work_pool(
792
- session=session,
793
- work_pool_id=work_pool.id,
794
- work_pool=schemas.internal.InternalWorkPoolUpdate(
795
- status=schemas.statuses.WorkPoolStatus.READY
796
- ),
797
- emit_status_change=emit_work_pool_status_event,
798
- )
799
-
800
1198
 
801
1199
  @router.post("/{work_pool_name}/workers/filter")
802
1200
  async def read_workers(