prefect-client 3.7.1.dev5__tar.gz → 3.7.1.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 (446) hide show
  1. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/PKG-INFO +1 -1
  2. prefect_client-3.7.1.dev6/src/prefect/_build_info.py +5 -0
  3. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/AGENTS.md +0 -1
  4. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/workers/AGENTS.md +6 -0
  5. prefect_client-3.7.1.dev6/src/prefect/workers/_cleanup.py +660 -0
  6. prefect_client-3.7.1.dev6/src/prefect/workers/_worker_channel/__init__.py +25 -0
  7. prefect_client-3.7.1.dev6/src/prefect/workers/_worker_channel/_protocol.py +378 -0
  8. prefect_client-3.7.1.dev6/src/prefect/workers/_worker_channel/_state.py +153 -0
  9. prefect_client-3.7.1.dev6/src/prefect/workers/_worker_channel/_sync.py +342 -0
  10. prefect_client-3.7.1.dev6/src/prefect/workers/_worker_channel/_transport.py +250 -0
  11. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/workers/base.py +106 -112
  12. prefect_client-3.7.1.dev5/src/prefect/_build_info.py +0 -5
  13. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/.gitignore +0 -0
  14. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/LICENSE +0 -0
  15. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/README.md +0 -0
  16. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/hatch_build.py +0 -0
  17. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/pyproject.toml +0 -0
  18. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/.prefectignore +0 -0
  19. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/AGENTS.md +0 -0
  20. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/__init__.py +0 -0
  21. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/__main__.py +0 -0
  22. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/__init__.py +0 -0
  23. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/_launchers.py +0 -0
  24. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/bundles/__init__.py +0 -0
  25. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/bundles/execute.py +0 -0
  26. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/plugins/__init__.py +0 -0
  27. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/plugins/apply.py +0 -0
  28. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  29. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/plugins/manager.py +0 -0
  30. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/plugins/spec.py +0 -0
  31. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/sla/__init__.py +0 -0
  32. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/sla/client.py +0 -0
  33. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_experimental/sla/objects.py +0 -0
  34. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_flow_run_suspension.py +0 -0
  35. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/__init__.py +0 -0
  36. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/_logging.py +0 -0
  37. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/__init__.py +0 -0
  38. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  39. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/client.py +0 -0
  40. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/device_id.py +0 -0
  41. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/emit.py +0 -0
  42. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/enabled.py +0 -0
  43. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/events.py +0 -0
  44. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/milestones.py +0 -0
  45. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/notice.py +0 -0
  46. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/analytics/service.py +0 -0
  47. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/ast_utils.py +0 -0
  48. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/buildx.py +0 -0
  49. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/compatibility/__init__.py +0 -0
  50. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  51. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/compatibility/backports.py +0 -0
  52. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/compatibility/blocks.py +0 -0
  53. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  54. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  55. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/compatibility/migration.py +0 -0
  56. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/compatibility/starlette.py +0 -0
  57. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/__init__.py +0 -0
  58. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/api.py +0 -0
  59. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/calls.py +0 -0
  60. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  61. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  62. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/inspection.py +0 -0
  63. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/primitives.py +0 -0
  64. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/services.py +0 -0
  65. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/threads.py +0 -0
  66. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/concurrency/waiters.py +0 -0
  67. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/control_listener.py +0 -0
  68. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/deprecated.py +0 -0
  69. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/engine.py +0 -0
  70. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/git.py +0 -0
  71. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  72. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/installation.py +0 -0
  73. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/integrations.py +0 -0
  74. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/launchers.py +0 -0
  75. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/lazy.py +0 -0
  76. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/metrics.py +0 -0
  77. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/observability.py +0 -0
  78. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/observers.py +0 -0
  79. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/plugins/__init__.py +0 -0
  80. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/plugins/apply.py +0 -0
  81. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/plugins/collections.py +0 -0
  82. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  83. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/plugins/manager.py +0 -0
  84. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/plugins/spec.py +0 -0
  85. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/plugins/startup.py +0 -0
  86. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/pydantic/__init__.py +0 -0
  87. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/pydantic/schemas.py +0 -0
  88. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  89. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  90. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  91. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/pytz.py +0 -0
  92. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/result_records.py +0 -0
  93. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/retries.py +0 -0
  94. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/schema.py +0 -0
  95. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/schemas/__init__.py +0 -0
  96. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/schemas/bases.py +0 -0
  97. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/schemas/fields.py +0 -0
  98. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/schemas/serializers.py +0 -0
  99. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/schemas/validators.py +0 -0
  100. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  101. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/states.py +0 -0
  102. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/testing.py +0 -0
  103. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/urls.py +0 -0
  104. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/uuid7.py +0 -0
  105. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/version_checking.py +0 -0
  106. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/versioning.py +0 -0
  107. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/waiters.py +0 -0
  108. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_internal/websockets.py +0 -0
  109. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/__init__.py +0 -0
  110. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/fetcher.py +0 -0
  111. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/generator.py +0 -0
  112. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/models.py +0 -0
  113. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/naming.py +0 -0
  114. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/renderer.py +0 -0
  115. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/schema_converter.py +0 -0
  116. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/templates/__init__.py +0 -0
  117. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  118. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/types.py +0 -0
  119. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_sdk/unions.py +0 -0
  120. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_vendor/croniter/__init__.py +0 -0
  121. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/_vendor/croniter/croniter.py +0 -0
  122. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/agent.py +0 -0
  123. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/analytics/__init__.py +0 -0
  124. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/artifacts.py +0 -0
  125. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/assets/__init__.py +0 -0
  126. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/assets/core.py +0 -0
  127. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/assets/materialize.py +0 -0
  128. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/automations.py +0 -0
  129. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/AGENTS.md +0 -0
  130. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/__init__.py +0 -0
  131. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/abstract.py +0 -0
  132. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/core.py +0 -0
  133. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/fields.py +0 -0
  134. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/notifications.py +0 -0
  135. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/redis.py +0 -0
  136. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/system.py +0 -0
  137. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/blocks/webhook.py +0 -0
  138. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/bundles/__init__.py +0 -0
  139. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/bundles/_file_collector.py +0 -0
  140. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/bundles/_ignore_filter.py +0 -0
  141. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/bundles/_path_resolver.py +0 -0
  142. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/bundles/_zip_builder.py +0 -0
  143. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/bundles/_zip_extractor.py +0 -0
  144. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/bundles/execute.py +0 -0
  145. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/cache_policies.py +0 -0
  146. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/AGENTS.md +0 -0
  147. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/__init__.py +0 -0
  148. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/attribution.py +0 -0
  149. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/base.py +0 -0
  150. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/cloud.py +0 -0
  151. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/collections.py +0 -0
  152. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/constants.py +0 -0
  153. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/__init__.py +0 -0
  154. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  155. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  156. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  157. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_automations/client.py +0 -0
  158. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  159. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  160. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  161. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  162. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  163. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  164. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  165. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  166. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  167. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  168. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  169. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_events/client.py +0 -0
  170. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  171. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  172. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  173. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_flows/client.py +0 -0
  174. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  175. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_logs/client.py +0 -0
  176. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  177. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_variables/client.py +0 -0
  178. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  179. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  180. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/base.py +0 -0
  181. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/orchestration/routes.py +0 -0
  182. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/__init__.py +0 -0
  183. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/actions.py +0 -0
  184. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/events.py +0 -0
  185. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/filters.py +0 -0
  186. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/objects.py +0 -0
  187. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/responses.py +0 -0
  188. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/schedules.py +0 -0
  189. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/sorting.py +0 -0
  190. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/schemas/worker_channel.py +0 -0
  191. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/subscriptions.py +0 -0
  192. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/types/__init__.py +0 -0
  193. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  194. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/client/utilities.py +0 -0
  195. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/AGENTS.md +0 -0
  196. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/__init__.py +0 -0
  197. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/_asyncio.py +0 -0
  198. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/_events.py +0 -0
  199. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/_leases.py +0 -0
  200. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/_sync.py +0 -0
  201. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/asyncio.py +0 -0
  202. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/context.py +0 -0
  203. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/services.py +0 -0
  204. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/sync.py +0 -0
  205. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/v1/__init__.py +0 -0
  206. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  207. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/v1/_events.py +0 -0
  208. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/v1/asyncio.py +0 -0
  209. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/v1/context.py +0 -0
  210. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/v1/services.py +0 -0
  211. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/concurrency/v1/sync.py +0 -0
  212. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/context.py +0 -0
  213. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/AGENTS.md +0 -0
  214. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/__init__.py +0 -0
  215. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/base.py +0 -0
  216. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/deployments.py +0 -0
  217. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/flow_runs.py +0 -0
  218. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/runner.py +0 -0
  219. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/schedules.py +0 -0
  220. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/steps/__init__.py +0 -0
  221. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/steps/core.py +0 -0
  222. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/steps/pull.py +0 -0
  223. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/deployments/steps/utility.py +0 -0
  224. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/docker/__init__.py +0 -0
  225. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/docker/_buildx.py +0 -0
  226. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/docker/docker_image.py +0 -0
  227. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/engine.py +0 -0
  228. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/AGENTS.md +0 -0
  229. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/__init__.py +0 -0
  230. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/actions.py +0 -0
  231. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/clients.py +0 -0
  232. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/filters.py +0 -0
  233. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/related.py +0 -0
  234. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/schemas/__init__.py +0 -0
  235. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/schemas/automations.py +0 -0
  236. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  237. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/schemas/events.py +0 -0
  238. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/schemas/labelling.py +0 -0
  239. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/subscribers.py +0 -0
  240. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/utilities.py +0 -0
  241. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/events/worker.py +0 -0
  242. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/exceptions.py +0 -0
  243. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/filesystems.py +0 -0
  244. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/flow_engine.py +0 -0
  245. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/flow_runs.py +0 -0
  246. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/flows.py +0 -0
  247. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/futures.py +0 -0
  248. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/infrastructure/__init__.py +0 -0
  249. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/infrastructure/base.py +0 -0
  250. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  251. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  252. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  253. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  254. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  255. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  256. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/input/__init__.py +0 -0
  257. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/input/actions.py +0 -0
  258. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/input/run_input.py +0 -0
  259. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/locking/__init__.py +0 -0
  260. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/locking/_filelock.py +0 -0
  261. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/locking/filesystem.py +0 -0
  262. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/locking/memory.py +0 -0
  263. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/locking/protocol.py +0 -0
  264. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/AGENTS.md +0 -0
  265. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/__init__.py +0 -0
  266. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/clients.py +0 -0
  267. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/configuration.py +0 -0
  268. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/filters.py +0 -0
  269. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/formatters.py +0 -0
  270. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/handlers.py +0 -0
  271. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/highlighters.py +0 -0
  272. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/loggers.py +0 -0
  273. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/logging/logging.yml +0 -0
  274. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/main.py +0 -0
  275. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/plugins.py +0 -0
  276. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/py.typed +0 -0
  277. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/results.py +0 -0
  278. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/AGENTS.md +0 -0
  279. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/__init__.py +0 -0
  280. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_cancel_finalizer.py +0 -0
  281. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_cancellation_manager.py +0 -0
  282. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_control_channel.py +0 -0
  283. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_deployment_registry.py +0 -0
  284. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_event_emitter.py +0 -0
  285. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_flow_resolver.py +0 -0
  286. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_flow_run_executor.py +0 -0
  287. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_hook_runner.py +0 -0
  288. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_limit_manager.py +0 -0
  289. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_process_manager.py +0 -0
  290. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  291. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_starter_bundle.py +0 -0
  292. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_starter_direct.py +0 -0
  293. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_starter_engine.py +0 -0
  294. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_state_proposer.py +0 -0
  295. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_workspace_resolver.py +0 -0
  296. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/_workspace_starter.py +0 -0
  297. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/runner.py +0 -0
  298. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/server.py +0 -0
  299. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runner/storage.py +0 -0
  300. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runtime/__init__.py +0 -0
  301. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runtime/deployment.py +0 -0
  302. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runtime/flow_run.py +0 -0
  303. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/runtime/task_run.py +0 -0
  304. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/schedules.py +0 -0
  305. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/serializers.py +0 -0
  306. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/__init__.py +0 -0
  307. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/admin.py +0 -0
  308. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/artifacts.py +0 -0
  309. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/automations.py +0 -0
  310. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/background_workers.py +0 -0
  311. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/block_capabilities.py +0 -0
  312. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/block_documents.py +0 -0
  313. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/block_schemas.py +0 -0
  314. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/block_types.py +0 -0
  315. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/clients.py +0 -0
  316. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/collections.py +0 -0
  317. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  318. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/concurrency_limits.py +0 -0
  319. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  320. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/csrf_token.py +0 -0
  321. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/dependencies.py +0 -0
  322. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/deployments.py +0 -0
  323. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/events.py +0 -0
  324. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/flow_run_states.py +0 -0
  325. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/flow_runs.py +0 -0
  326. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/flows.py +0 -0
  327. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/logs.py +0 -0
  328. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/middleware.py +0 -0
  329. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/root.py +0 -0
  330. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/run_history.py +0 -0
  331. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/saved_searches.py +0 -0
  332. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/server.py +0 -0
  333. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  334. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/task_run_states.py +0 -0
  335. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/task_runs.py +0 -0
  336. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/task_workers.py +0 -0
  337. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/templates.py +0 -0
  338. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/ui/__init__.py +0 -0
  339. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/ui/flow_runs.py +0 -0
  340. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/ui/flows.py +0 -0
  341. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/ui/schemas.py +0 -0
  342. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/ui/task_runs.py +0 -0
  343. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/validation.py +0 -0
  344. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/variables.py +0 -0
  345. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/work_queues.py +0 -0
  346. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/server/api/workers.py +0 -0
  347. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/AGENTS.md +0 -0
  348. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/__init__.py +0 -0
  349. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/base.py +0 -0
  350. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/constants.py +0 -0
  351. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/context.py +0 -0
  352. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/legacy.py +0 -0
  353. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/__init__.py +0 -0
  354. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/_defaults.py +0 -0
  355. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/api.py +0 -0
  356. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/cli.py +0 -0
  357. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/client.py +0 -0
  358. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/cloud.py +0 -0
  359. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/deployments.py +0 -0
  360. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/events.py +0 -0
  361. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/experiments.py +0 -0
  362. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/flows.py +0 -0
  363. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/internal.py +0 -0
  364. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/logging.py +0 -0
  365. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/plugins.py +0 -0
  366. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/results.py +0 -0
  367. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/root.py +0 -0
  368. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/runner.py +0 -0
  369. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/__init__.py +0 -0
  370. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/api.py +0 -0
  371. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/concurrency.py +0 -0
  372. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/database.py +0 -0
  373. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/deployments.py +0 -0
  374. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/docket.py +0 -0
  375. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/ephemeral.py +0 -0
  376. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/events.py +0 -0
  377. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  378. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/logs.py +0 -0
  379. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/root.py +0 -0
  380. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/services.py +0 -0
  381. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/tasks.py +0 -0
  382. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/server/ui.py +0 -0
  383. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/tasks.py +0 -0
  384. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/telemetry.py +0 -0
  385. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/testing.py +0 -0
  386. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/models/worker.py +0 -0
  387. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/profiles.py +0 -0
  388. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/profiles.toml +0 -0
  389. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/settings/sources.py +0 -0
  390. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/states.py +0 -0
  391. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/task_engine.py +0 -0
  392. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/task_runners.py +0 -0
  393. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/task_runs.py +0 -0
  394. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/task_worker.py +0 -0
  395. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/tasks.py +0 -0
  396. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/telemetry/__init__.py +0 -0
  397. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/telemetry/run_telemetry.py +0 -0
  398. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/transactions.py +0 -0
  399. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/types/__init__.py +0 -0
  400. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/types/_concurrency.py +0 -0
  401. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/types/_datetime.py +0 -0
  402. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/types/entrypoint.py +0 -0
  403. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/types/names.py +0 -0
  404. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/__init__.py +0 -0
  405. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/annotations.py +0 -0
  406. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  407. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  408. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/callables/AGENTS.md +0 -0
  409. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/callables/__init__.py +0 -0
  410. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/collections.py +0 -0
  411. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/compat.py +0 -0
  412. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/context.py +0 -0
  413. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/dispatch.py +0 -0
  414. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/dockerutils.py +0 -0
  415. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/engine/AGENTS.md +0 -0
  416. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/engine/__init__.py +0 -0
  417. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  418. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/filesystem/__init__.py +0 -0
  419. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/generics.py +0 -0
  420. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/hashing.py +0 -0
  421. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/importtools.py +0 -0
  422. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/math.py +0 -0
  423. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/names.py +0 -0
  424. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  425. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/processutils/__init__.py +0 -0
  426. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/pydantic.py +0 -0
  427. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/render_swagger.py +0 -0
  428. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  429. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  430. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  431. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/schema_tools/validation.py +0 -0
  432. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/services.py +0 -0
  433. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/slugify.py +0 -0
  434. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/templating/AGENTS.md +0 -0
  435. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/templating/__init__.py +0 -0
  436. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/text.py +0 -0
  437. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/timeout.py +0 -0
  438. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/urls.py +0 -0
  439. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/utilities/visualization.py +0 -0
  440. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/variables.py +0 -0
  441. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/workers/__init__.py +0 -0
  442. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/workers/block.py +0 -0
  443. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/workers/cloud.py +0 -0
  444. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/workers/process.py +0 -0
  445. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/src/prefect/workers/server.py +0 -0
  446. {prefect_client-3.7.1.dev5 → prefect_client-3.7.1.dev6}/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.1.dev5
3
+ Version: 3.7.1.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://docs.prefect.io
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.7.1.dev6"
3
+ __build_date__ = "2026-05-12 09:04:39.810368+00:00"
4
+ __git_commit__ = "5d909d2aeb5011f5017fcee073b7e445c1d7b078"
5
+ __dirty__ = False
@@ -47,4 +47,3 @@ These modules have no dedicated intent node yet. Promote any one of them to a su
47
47
  - `slugify.py` — Thin wrapper around `unicode-slugify`
48
48
  - `generics.py` — Generic type validation
49
49
  - `render_swagger.py` — MkDocs plugin for rendering Swagger/OpenAPI schemas
50
-
@@ -15,6 +15,12 @@ This module does NOT manage the Runner execution model (no work pool) — see `r
15
15
  - `ProcessWorker` (`process.py`) — runs flow runs as local subprocesses via `Runner.execute_bundle()`
16
16
  - `BaseWorkerResult` — result returned by `run()`; wraps infrastructure status codes
17
17
 
18
+ ## Worker Channel
19
+
20
+ `BaseWorker.sync_with_backend()` is a thin boundary: it ensures a `WorkerChannel` exists and delegates to `_worker_channel.WorkPoolWorkerChannel.sync(...)`. The channel owns the WebSocket-first path and the REST fallback path, including work-pool read/create/template repair and worker heartbeat. Scheduled flow-run polling remains REST-based.
21
+
22
+ **Anti-pattern**: Do not split heartbeat or work-pool sync responsibility back into `BaseWorker`; keep sync ownership at the channel boundary.
23
+
18
24
  ## Attribution Env Vars
19
25
 
20
26
  Workers stamp two env vars into `os.environ` for their own process, so all API requests include attribution headers:
@@ -0,0 +1,660 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import inspect
5
+ import logging
6
+ from collections.abc import Awaitable, Callable, Iterable
7
+ from dataclasses import dataclass
8
+ from enum import Enum
9
+ from typing import Any, Protocol, TypeAlias, cast
10
+ from uuid import UUID
11
+
12
+ import anyio
13
+
14
+ from prefect._internal.uuid7 import uuid7
15
+ from prefect.client.schemas.worker_channel import (
16
+ SUPPORTED_CLEANUP_KINDS,
17
+ CleanupAckFrame,
18
+ CleanupKind,
19
+ CleanupMessageFrame,
20
+ CleanupMessagePayload,
21
+ CleanupOperation,
22
+ CleanupOperationPayload,
23
+ CleanupOperationResultFrame,
24
+ CleanupReleaseFrame,
25
+ CleanupReleasePayload,
26
+ CleanupRenewFrame,
27
+ )
28
+ from prefect.logging import get_logger
29
+ from prefect.types._datetime import DateTime, now
30
+
31
+ CleanupOperationFrame: TypeAlias = (
32
+ CleanupAckFrame | CleanupReleaseFrame | CleanupRenewFrame
33
+ )
34
+ CleanupOperationSender: TypeAlias = Callable[
35
+ [CleanupOperationFrame],
36
+ Awaitable[CleanupOperationResultFrame | None] | CleanupOperationResultFrame | None,
37
+ ]
38
+
39
+
40
+ @dataclass(frozen=True)
41
+ class CleanupExecutionResult:
42
+ operation: CleanupOperation
43
+ reason: str | None = None
44
+
45
+ def __post_init__(self) -> None:
46
+ if self.operation not in {"ack", "release"}:
47
+ raise ValueError("Cleanup execution results must ack or release")
48
+ if self.operation == "release" and not self.reason:
49
+ raise ValueError("Cleanup release results require a reason")
50
+
51
+ @classmethod
52
+ def success(cls) -> CleanupExecutionResult:
53
+ return cls("ack")
54
+
55
+ @classmethod
56
+ def noop(cls) -> CleanupExecutionResult:
57
+ return cls.success()
58
+
59
+ @classmethod
60
+ def release(cls, reason: str) -> CleanupExecutionResult:
61
+ return cls("release", reason=reason)
62
+
63
+
64
+ class WorkerCleanupHandler(Protocol):
65
+ async def cleanup(
66
+ self, message: CleanupMessagePayload
67
+ ) -> CleanupExecutionResult | None:
68
+ """
69
+ Cleanup handlers must be idempotent.
70
+
71
+ Returning `None` is treated as idempotent success.
72
+ """
73
+
74
+
75
+ class WorkerCleanupHandlerRegistry:
76
+ def __init__(self, handlers: Iterable[WorkerCleanupHandler] = ()):
77
+ self._handlers: dict[CleanupKind, WorkerCleanupHandler] = {}
78
+ for handler in handlers:
79
+ self.register(handler)
80
+
81
+ def __bool__(self) -> bool:
82
+ return bool(self._handlers)
83
+
84
+ @property
85
+ def handled_cleanup_kinds(self) -> tuple[CleanupKind, ...]:
86
+ return tuple(sorted(self._handlers))
87
+
88
+ def register(self, handler: WorkerCleanupHandler) -> None:
89
+ for kind in self._handler_kinds(handler):
90
+ if kind not in SUPPORTED_CLEANUP_KINDS:
91
+ raise ValueError(f"Unsupported cleanup kind: {kind!r}")
92
+ if kind in self._handlers:
93
+ raise ValueError(f"Cleanup handler already registered for {kind!r}")
94
+ self._handlers[kind] = handler
95
+
96
+ def get(self, kind: CleanupKind) -> WorkerCleanupHandler | None:
97
+ return self._handlers.get(kind)
98
+
99
+ @staticmethod
100
+ def _handler_kinds(handler: WorkerCleanupHandler) -> tuple[CleanupKind, ...]:
101
+ cleanup_kinds = getattr(handler, "cleanup_kinds", None)
102
+ if cleanup_kinds is None:
103
+ cleanup_kind = getattr(handler, "cleanup_kind", None)
104
+ if cleanup_kind is None:
105
+ raise ValueError(
106
+ "Cleanup handlers must define `cleanup_kind` or `cleanup_kinds`"
107
+ )
108
+ cleanup_kinds = (cleanup_kind,)
109
+
110
+ if isinstance(cleanup_kinds, str):
111
+ cleanup_kinds = (cleanup_kinds,)
112
+ kinds = tuple(cleanup_kinds)
113
+ if not kinds:
114
+ raise ValueError("Cleanup handlers must declare at least one cleanup kind")
115
+ return cast(tuple[CleanupKind, ...], kinds)
116
+
117
+
118
+ class CleanupOperationResultAction(str, Enum):
119
+ ACCEPTED = "accepted"
120
+ LOST_RESERVATION = "lost_reservation"
121
+ ACK_NOT_FOUND = "ack_not_found"
122
+ RETRYABLE_ERROR = "retryable_error"
123
+ IGNORED = "ignored"
124
+
125
+
126
+ _LOST_RESERVATION_STATUSES = {
127
+ "not_current",
128
+ "expired",
129
+ "invalid_token",
130
+ "unauthorized",
131
+ "dead_lettered",
132
+ }
133
+
134
+
135
+ @dataclass
136
+ class _PendingOperation:
137
+ frame: CleanupOperationFrame
138
+ future: asyncio.Future[CleanupOperationResultFrame]
139
+
140
+
141
+ @dataclass
142
+ class _ReservationState:
143
+ message_id: UUID
144
+ reservation_token: str
145
+ lease_expires_at: DateTime
146
+ owns_reservation: bool = True
147
+
148
+
149
+ @dataclass
150
+ class _ActiveReservation:
151
+ state: _ReservationState
152
+ cleanup_scope: anyio.CancelScope
153
+
154
+
155
+ class WorkerCleanupExecutor:
156
+ def __init__(
157
+ self,
158
+ handlers: WorkerCleanupHandlerRegistry | Iterable[WorkerCleanupHandler],
159
+ send_operation: CleanupOperationSender | None = None,
160
+ max_concurrency: int | None = None,
161
+ *,
162
+ lease_renewal_buffer_seconds: float = 5.0,
163
+ operation_result_timeout_seconds: float = 30.0,
164
+ operation_retry_delay_seconds: float = 1.0,
165
+ max_operation_attempts: int = 3,
166
+ logger: logging.Logger | None = None,
167
+ ):
168
+ if isinstance(handlers, WorkerCleanupHandlerRegistry):
169
+ self._handlers = handlers
170
+ else:
171
+ self._handlers = WorkerCleanupHandlerRegistry(handlers)
172
+
173
+ default_concurrency = 1 if self._handlers else 0
174
+ self.max_concurrency = default_concurrency
175
+ if max_concurrency is not None:
176
+ if max_concurrency < 0:
177
+ raise ValueError("Cleanup concurrency cannot be negative")
178
+ self.max_concurrency = max_concurrency
179
+ if max_operation_attempts < 1:
180
+ raise ValueError("Cleanup operation attempts must be positive")
181
+
182
+ self._send_operation = send_operation or self._missing_operation_sender
183
+ self.effective_max_concurrency = self.max_concurrency
184
+ self._limiter = (
185
+ anyio.CapacityLimiter(self.effective_max_concurrency)
186
+ if self.effective_max_concurrency > 0
187
+ else None
188
+ )
189
+ self._lease_renewal_buffer_seconds = lease_renewal_buffer_seconds
190
+ self._operation_result_timeout_seconds = operation_result_timeout_seconds
191
+ self._operation_retry_delay_seconds = operation_retry_delay_seconds
192
+ self._max_operation_attempts = max_operation_attempts
193
+ self._pending_operations: dict[UUID, _PendingOperation] = {}
194
+ self._active_reservations: dict[str, _ActiveReservation] = {}
195
+ self._task_group: anyio.abc.TaskGroup | None = None
196
+ self._logger = logger or get_logger(__name__)
197
+
198
+ @property
199
+ def handled_cleanup_kinds(self) -> tuple[CleanupKind, ...]:
200
+ return self._handlers.handled_cleanup_kinds
201
+
202
+ @property
203
+ def in_flight_count(self) -> int:
204
+ if self._limiter is None:
205
+ return 0
206
+ return int(self._limiter.borrowed_tokens)
207
+
208
+ def set_operation_sender(self, send_operation: CleanupOperationSender) -> None:
209
+ self._send_operation = send_operation
210
+
211
+ def set_effective_max_concurrency(self, effective_max_concurrency: int) -> None:
212
+ if effective_max_concurrency < 0:
213
+ raise ValueError("Cleanup concurrency cannot be negative")
214
+ effective_max_concurrency = min(
215
+ effective_max_concurrency,
216
+ self.max_concurrency,
217
+ )
218
+ self.effective_max_concurrency = effective_max_concurrency
219
+ if effective_max_concurrency == 0:
220
+ self._limiter = None
221
+ return
222
+
223
+ if self._limiter is None:
224
+ self._limiter = anyio.CapacityLimiter(effective_max_concurrency)
225
+ else:
226
+ self._limiter.total_tokens = effective_max_concurrency
227
+
228
+ def cancel(self) -> None:
229
+ if self._task_group is not None:
230
+ self._task_group.cancel_scope.cancel()
231
+
232
+ def cancel_in_flight(self) -> None:
233
+ for active in tuple(self._active_reservations.values()):
234
+ self._lose_reservation(active.state, active.cleanup_scope)
235
+
236
+ @staticmethod
237
+ def _missing_operation_sender(
238
+ frame: CleanupOperationFrame,
239
+ ) -> CleanupOperationResultFrame | None:
240
+ raise RuntimeError(
241
+ f"Cleanup operation sender has not been configured for {frame.type!r}"
242
+ )
243
+
244
+ async def __aenter__(self) -> WorkerCleanupExecutor:
245
+ if self._task_group is not None:
246
+ raise RuntimeError("WorkerCleanupExecutor is already running")
247
+ self._task_group = anyio.create_task_group()
248
+ await self._task_group.__aenter__()
249
+ return self
250
+
251
+ async def __aexit__(self, *exc_info: Any) -> None:
252
+ if self._task_group is None:
253
+ return
254
+ task_group = self._task_group
255
+ self._task_group = None
256
+ await task_group.__aexit__(*exc_info)
257
+
258
+ def submit(self, frame: CleanupMessageFrame) -> None:
259
+ if self._task_group is None:
260
+ raise RuntimeError(
261
+ "WorkerCleanupExecutor must be used as an async context manager "
262
+ "before cleanup messages can be submitted"
263
+ )
264
+ self._task_group.start_soon(self.execute, frame)
265
+
266
+ async def execute(self, frame: CleanupMessageFrame) -> None:
267
+ payload = frame.payload
268
+ handler = self._handlers.get(payload.kind)
269
+ if handler is None:
270
+ await self._release(payload, reason="unsupported_cleanup_kind")
271
+ return
272
+
273
+ limiter = self._limiter
274
+ if limiter is None:
275
+ await self._release(payload, reason="cleanup_delivery_unavailable")
276
+ return
277
+
278
+ state = _ReservationState(
279
+ message_id=payload.message_id,
280
+ reservation_token=payload.reservation_token,
281
+ lease_expires_at=payload.lease_expires_at,
282
+ )
283
+ if self._lease_expired(state):
284
+ self._logger.debug(
285
+ "Skipping cleanup message %s because the reservation lease has expired",
286
+ payload.message_id,
287
+ )
288
+ return
289
+
290
+ if payload.reservation_token in self._active_reservations:
291
+ self._logger.debug(
292
+ "Ignoring duplicate cleanup delivery for active reservation %s",
293
+ payload.reservation_token,
294
+ )
295
+ return
296
+
297
+ try:
298
+ limiter.acquire_on_behalf_of_nowait(payload.reservation_token)
299
+ except anyio.WouldBlock:
300
+ await self._release(payload, reason="concurrency_limit_reached")
301
+ return
302
+ except RuntimeError:
303
+ self._logger.debug(
304
+ "Ignoring duplicate cleanup delivery for borrowed reservation %s",
305
+ payload.reservation_token,
306
+ )
307
+ return
308
+
309
+ try:
310
+ with anyio.CancelScope() as cleanup_scope:
311
+ self._active_reservations[payload.reservation_token] = (
312
+ _ActiveReservation(state, cleanup_scope)
313
+ )
314
+ try:
315
+ async with anyio.create_task_group() as renewal_group:
316
+ renewal_group.start_soon(
317
+ self._renew_until_finished,
318
+ state,
319
+ cleanup_scope,
320
+ )
321
+ try:
322
+ result = await self._run_handler(handler, payload)
323
+ except Exception:
324
+ self._logger.exception(
325
+ "Cleanup handler failed for message %s",
326
+ payload.message_id,
327
+ )
328
+ result = CleanupExecutionResult.release("handler_failed")
329
+
330
+ if state.owns_reservation:
331
+ if result is None:
332
+ result = CleanupExecutionResult.success()
333
+
334
+ if result.operation == "ack":
335
+ await self._ack(payload)
336
+ else:
337
+ await self._release(
338
+ payload,
339
+ reason=result.reason or "handler_released",
340
+ )
341
+
342
+ renewal_group.cancel_scope.cancel()
343
+ finally:
344
+ self._active_reservations.pop(payload.reservation_token, None)
345
+
346
+ if not state.owns_reservation:
347
+ self._logger.debug(
348
+ "Skipping cleanup result for message %s because the reservation "
349
+ "is no longer current",
350
+ payload.message_id,
351
+ )
352
+ return
353
+ finally:
354
+ limiter.release_on_behalf_of(payload.reservation_token)
355
+
356
+ async def _run_handler(
357
+ self,
358
+ handler: WorkerCleanupHandler,
359
+ payload: CleanupMessagePayload,
360
+ ) -> CleanupExecutionResult | None:
361
+ result = handler.cleanup(payload)
362
+ if inspect.isawaitable(result):
363
+ result = await result
364
+ if result is not None and not isinstance(result, CleanupExecutionResult):
365
+ raise TypeError(
366
+ "Cleanup handlers must return CleanupExecutionResult or None"
367
+ )
368
+ return result
369
+
370
+ async def _ack(
371
+ self, payload: CleanupMessagePayload
372
+ ) -> CleanupOperationResultFrame | None:
373
+ return await self._send_operation_until_resolved(
374
+ operation="ack",
375
+ payload=payload,
376
+ )
377
+
378
+ async def _release(
379
+ self, payload: CleanupMessagePayload, reason: str
380
+ ) -> CleanupOperationResultFrame | None:
381
+ return await self._send_operation_until_resolved(
382
+ operation="release",
383
+ payload=payload,
384
+ reason=reason,
385
+ )
386
+
387
+ async def _renew_until_finished(
388
+ self,
389
+ state: _ReservationState,
390
+ cleanup_scope: anyio.CancelScope,
391
+ ) -> None:
392
+ while state.owns_reservation:
393
+ sleep_seconds = self._seconds_until_renewal(state.lease_expires_at)
394
+ if sleep_seconds > 0:
395
+ await anyio.sleep(sleep_seconds)
396
+
397
+ if not state.owns_reservation:
398
+ return
399
+
400
+ if self._lease_expired(state):
401
+ self._lose_reservation(state, cleanup_scope)
402
+ return
403
+
404
+ result = await self._send_operation_until_resolved(
405
+ operation="renew",
406
+ message_id=state.message_id,
407
+ reservation_token=state.reservation_token,
408
+ deadline=state.lease_expires_at,
409
+ )
410
+ if result is None:
411
+ if self._lease_expired(state):
412
+ self._lose_reservation(state, cleanup_scope)
413
+ return
414
+ if not await self._sleep_before_operation_retry(state.lease_expires_at):
415
+ self._lose_reservation(state, cleanup_scope)
416
+ return
417
+ continue
418
+ action = self.classify_operation_result(result)
419
+ if action is CleanupOperationResultAction.ACCEPTED:
420
+ if result.payload.lease_expires_at is not None:
421
+ state.lease_expires_at = result.payload.lease_expires_at
422
+ continue
423
+
424
+ if action is CleanupOperationResultAction.RETRYABLE_ERROR:
425
+ if self._lease_expired(state):
426
+ self._lose_reservation(state, cleanup_scope)
427
+ return
428
+ if not await self._sleep_before_operation_retry(state.lease_expires_at):
429
+ self._lose_reservation(state, cleanup_scope)
430
+ return
431
+ continue
432
+
433
+ self._lose_reservation(state, cleanup_scope)
434
+ return
435
+
436
+ def _lease_expired(self, state: _ReservationState) -> bool:
437
+ return now("UTC") >= state.lease_expires_at
438
+
439
+ @staticmethod
440
+ def _lose_reservation(
441
+ state: _ReservationState,
442
+ cleanup_scope: anyio.CancelScope,
443
+ ) -> None:
444
+ state.owns_reservation = False
445
+ cleanup_scope.cancel()
446
+
447
+ def _seconds_until_renewal(self, lease_expires_at: DateTime) -> float:
448
+ return max(
449
+ 0.0,
450
+ self._seconds_until(lease_expires_at) - self._lease_renewal_buffer_seconds,
451
+ )
452
+
453
+ async def _send_operation_until_resolved(
454
+ self,
455
+ operation: CleanupOperation,
456
+ payload: CleanupMessagePayload | None = None,
457
+ *,
458
+ message_id: UUID | None = None,
459
+ reservation_token: str | None = None,
460
+ reason: str | None = None,
461
+ deadline: DateTime | None = None,
462
+ ) -> CleanupOperationResultFrame | None:
463
+ if payload is not None:
464
+ message_id = payload.message_id
465
+ reservation_token = payload.reservation_token
466
+ if message_id is None or reservation_token is None:
467
+ raise ValueError("Cleanup operations require a message id and token")
468
+
469
+ last_result: CleanupOperationResultFrame | None = None
470
+ last_exception: Exception | None = None
471
+ for attempt in range(1, self._max_operation_attempts + 1):
472
+ attempt_timeout = self._operation_attempt_timeout(deadline)
473
+ if attempt_timeout <= 0:
474
+ break
475
+
476
+ frame = self._build_operation_frame(
477
+ operation=operation,
478
+ message_id=message_id,
479
+ reservation_token=reservation_token,
480
+ reason=reason,
481
+ )
482
+ try:
483
+ result = await self._send_operation_once(
484
+ frame,
485
+ timeout=attempt_timeout,
486
+ )
487
+ except Exception as exc:
488
+ self._logger.debug(
489
+ "Cleanup %s operation failed for message %s",
490
+ operation,
491
+ message_id,
492
+ exc_info=True,
493
+ )
494
+ last_exception = exc
495
+ if attempt == self._max_operation_attempts:
496
+ break
497
+ if not await self._sleep_before_operation_retry(deadline):
498
+ break
499
+ continue
500
+
501
+ last_result = result
502
+ action = self.classify_operation_result(result)
503
+ if action is CleanupOperationResultAction.RETRYABLE_ERROR:
504
+ if attempt == self._max_operation_attempts:
505
+ return result
506
+ if not await self._sleep_before_operation_retry(deadline):
507
+ return result
508
+ continue
509
+ return result
510
+
511
+ if last_result is None and last_exception is not None:
512
+ self._logger.debug(
513
+ "Cleanup %s operation exhausted after %s attempt(s) for message %s: %r",
514
+ operation,
515
+ self._max_operation_attempts,
516
+ message_id,
517
+ last_exception,
518
+ )
519
+ return last_result
520
+
521
+ async def _send_operation_once(
522
+ self,
523
+ frame: CleanupOperationFrame,
524
+ *,
525
+ timeout: float,
526
+ ) -> CleanupOperationResultFrame:
527
+ loop = asyncio.get_running_loop()
528
+ future: asyncio.Future[CleanupOperationResultFrame] = loop.create_future()
529
+ self._pending_operations[frame.id] = _PendingOperation(
530
+ frame=frame,
531
+ future=future,
532
+ )
533
+ try:
534
+ return await asyncio.wait_for(
535
+ self._send_operation_and_wait(frame, future),
536
+ timeout=timeout,
537
+ )
538
+ finally:
539
+ self._pending_operations.pop(frame.id, None)
540
+
541
+ async def _send_operation_and_wait(
542
+ self,
543
+ frame: CleanupOperationFrame,
544
+ future: asyncio.Future[CleanupOperationResultFrame],
545
+ ) -> CleanupOperationResultFrame:
546
+ result = self._send_operation(frame)
547
+ if inspect.isawaitable(result):
548
+ result = await result
549
+ if result is not None:
550
+ if isinstance(result, dict):
551
+ result = CleanupOperationResultFrame.model_validate(result)
552
+ if not isinstance(result, CleanupOperationResultFrame):
553
+ raise TypeError(
554
+ "Cleanup operation senders must return "
555
+ "CleanupOperationResultFrame, a frame dict, or None"
556
+ )
557
+ return result
558
+ return await future
559
+
560
+ def _operation_attempt_timeout(self, deadline: DateTime | None) -> float:
561
+ timeout = self._operation_result_timeout_seconds
562
+ if deadline is not None:
563
+ timeout = min(timeout, self._seconds_until(deadline))
564
+ return max(0.0, timeout)
565
+
566
+ async def _sleep_before_operation_retry(
567
+ self,
568
+ deadline: DateTime | None,
569
+ ) -> bool:
570
+ sleep_seconds = self._operation_retry_delay_seconds
571
+ if deadline is not None:
572
+ remaining_seconds = self._seconds_until(deadline)
573
+ if remaining_seconds <= 0:
574
+ return False
575
+ sleep_seconds = min(sleep_seconds, remaining_seconds)
576
+
577
+ if sleep_seconds > 0:
578
+ await anyio.sleep(sleep_seconds)
579
+
580
+ return deadline is None or self._seconds_until(deadline) > 0
581
+
582
+ @staticmethod
583
+ def _seconds_until(deadline: DateTime) -> float:
584
+ return (deadline - now("UTC")).total_seconds()
585
+
586
+ def handle_operation_result(
587
+ self, frame: CleanupOperationResultFrame
588
+ ) -> CleanupOperationResultAction:
589
+ pending = self._pending_operations.get(frame.payload.request_frame_id)
590
+ if pending is None:
591
+ return CleanupOperationResultAction.IGNORED
592
+ if not pending.future.done():
593
+ pending.future.set_result(frame)
594
+ return self.classify_operation_result(frame)
595
+
596
+ @staticmethod
597
+ def classify_operation_result(
598
+ frame: CleanupOperationResultFrame,
599
+ ) -> CleanupOperationResultAction:
600
+ status = frame.payload.status
601
+ if status == "accepted":
602
+ return CleanupOperationResultAction.ACCEPTED
603
+ if status == "error":
604
+ return CleanupOperationResultAction.RETRYABLE_ERROR
605
+ if status == "not_found" and frame.payload.operation == "ack":
606
+ return CleanupOperationResultAction.ACK_NOT_FOUND
607
+ if status == "not_found" or status in _LOST_RESERVATION_STATUSES:
608
+ return CleanupOperationResultAction.LOST_RESERVATION
609
+ return CleanupOperationResultAction.RETRYABLE_ERROR
610
+
611
+ def _build_operation_frame(
612
+ self,
613
+ operation: CleanupOperation,
614
+ message_id: UUID,
615
+ reservation_token: str,
616
+ reason: str | None = None,
617
+ ) -> CleanupOperationFrame:
618
+ frame_base = {
619
+ "id": uuid7(),
620
+ "sent_at": now("UTC"),
621
+ }
622
+ operation_payload = CleanupOperationPayload(
623
+ message_id=message_id,
624
+ reservation_token=reservation_token,
625
+ )
626
+ if operation == "ack":
627
+ return CleanupAckFrame(
628
+ type="cleanup.ack.v1",
629
+ payload=operation_payload,
630
+ **frame_base,
631
+ )
632
+ if operation == "renew":
633
+ return CleanupRenewFrame(
634
+ type="cleanup.renew.v1",
635
+ payload=operation_payload,
636
+ **frame_base,
637
+ )
638
+
639
+ if not reason:
640
+ raise ValueError("Cleanup release operations require a reason")
641
+ return CleanupReleaseFrame(
642
+ type="cleanup.release.v1",
643
+ payload=CleanupReleasePayload(
644
+ message_id=message_id,
645
+ reservation_token=reservation_token,
646
+ reason=reason,
647
+ ),
648
+ **frame_base,
649
+ )
650
+
651
+
652
+ __all__ = [
653
+ "CleanupExecutionResult",
654
+ "CleanupOperationFrame",
655
+ "CleanupOperationResultAction",
656
+ "CleanupOperationSender",
657
+ "WorkerCleanupExecutor",
658
+ "WorkerCleanupHandler",
659
+ "WorkerCleanupHandlerRegistry",
660
+ ]