prefect-client 3.9.2.dev4__tar.gz → 3.9.2.dev5__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.
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/PKG-INFO +1 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/AGENTS.md +1 -0
- prefect_client-3.9.2.dev5/src/prefect/_build_info.py +5 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/engine.py +59 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/objects.py +2 -2
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/flow_engine.py +9 -3
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/flows.py +35 -10
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/infrastructure/provisioners/coiled.py +1 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/infrastructure/provisioners/modal.py +1 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/input/actions.py +3 -2
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/locking/filesystem.py +9 -4
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/locking/memory.py +10 -5
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/locking/protocol.py +6 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/AGENTS.md +2 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_hook_runner.py +4 -5
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_workspace_runtime_bootstrap.py +48 -8
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/storage.py +18 -3
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/deployments.py +3 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/flow_runs.py +3 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/server.py +3 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/work_queues.py +19 -12
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/workers.py +17 -14
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/task_runners.py +10 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/callables/__init__.py +6 -3
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/collections.py +10 -1
- prefect_client-3.9.2.dev4/src/prefect/_build_info.py +0 -5
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/.gitignore +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/LICENSE +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/README.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/hatch_build.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/pyproject.toml +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/__main__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/_observation_delivery.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/attempt_control.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/server_maintenance.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/agent.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/automations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/engine.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/related.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/futures.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/main.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/plugins.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/py.typed +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/results.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_uv_command.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_workspace_hook_runner.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_workspace_runtime.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/_workspace_supervisor.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/schedules.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/serializers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/observed_states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/_types.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/tasks.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/transactions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/types/_datetime_deprecations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/types/names.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/variables.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.9.2.
|
|
3
|
+
Version: 3.9.2.dev5
|
|
4
4
|
Summary: Workflow orchestration and management.
|
|
5
5
|
Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
|
|
6
6
|
Project-URL: Documentation, https://www.prefect.io/docs
|
|
@@ -41,6 +41,7 @@ Runtime flow/task parameter values must come from `utilities.callables.get_call_
|
|
|
41
41
|
- **`ResultRecordMetadata` tolerates unknown serializer types.** When loading persisted metadata, an unrecognized serializer `type` is converted to an `UnknownSerializer` placeholder rather than raising `ValidationError`. This allows inspecting result metadata when the serializer implementation is unavailable in the current environment. However, known serializer types with invalid fields still raise `ValidationError`. `UnknownSerializer.dumps()` and `UnknownSerializer.loads()` raise `RuntimeError` — the tolerance is for inspection only, not actual serialization/deserialization.
|
|
42
42
|
- **`ResultRecord` must be marked persisted after every storage write.** `ResultStore` calls `mark_persisted()` on every record it writes; `to_state_create` in `states.py` consults `is_persisted` as a fallback when `should_persist_result()` returns `False` (e.g., after run context teardown). Any new sync or async persist path that omits `mark_persisted()` will silently drop state metadata for already-written results.
|
|
43
43
|
- **Flow-run suspension is enforced at orchestration boundaries.** Suspension is delivered via `FlowRunSuspensionRequest` and raised with `raise_if_flow_run_suspension_requested()`. When changing engines, futures, task runners, or generator execution, check before returning control to flow user code or proposing a flow state that could leave `Suspended`; keep sync/async paths aligned and avoid per-boundary API reads.
|
|
44
|
+
- **Flow state hooks accept the same signatures on every execution path.** The sync and async flow engines and `runner/_hook_runner.py` share `_internal/engine.py::resolve_flow_hook_arguments`; `runner/_workspace_runtime_bootstrap.py` keeps its own copy because it may run under an older Prefect. Change the shared function and the copy together.
|
|
44
45
|
- **Subflow tracking tasks use UUID dynamic keys when called from within a submitted task.** `flow_engine.py` marks the synthetic tracking `Task` with `_is_subflow_tracking_task=True`; `tasks.py` checks this flag to assign UUID-based (unstable) `dynamic_key` values when the tracking task runs inside a submitted task context. This prevents key collisions between concurrent sibling subflows on parent-flow retry. Direct subflow calls (no enclosing task context) keep stable sequential keys to preserve the retry optimization that reuses completed subflow results.
|
|
45
46
|
|
|
46
47
|
## Logging
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Internal engine utilities"""
|
|
2
2
|
|
|
3
|
+
import inspect
|
|
3
4
|
from collections.abc import Callable
|
|
4
5
|
from functools import partial
|
|
5
6
|
from typing import TYPE_CHECKING, Any, Union
|
|
@@ -9,6 +10,9 @@ from prefect.context import FlowRunContext
|
|
|
9
10
|
from prefect.flows import Flow
|
|
10
11
|
from prefect.tasks import Task, TaskRunNameCallbackWithParameters
|
|
11
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from prefect.client.schemas.objects import FlowRun, State
|
|
15
|
+
|
|
12
16
|
|
|
13
17
|
def dynamic_key_for_task_run(
|
|
14
18
|
context: FlowRunContext, task: "Task[..., Any]", stable: bool = True
|
|
@@ -93,3 +97,58 @@ def get_hook_name(hook: Callable[..., Any]) -> str:
|
|
|
93
97
|
hook.func.__name__ if isinstance(hook, partial) else hook.__class__.__name__
|
|
94
98
|
)
|
|
95
99
|
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def resolve_flow_hook_arguments(
|
|
103
|
+
hook: Callable[..., Any],
|
|
104
|
+
flow: "Flow[..., Any]",
|
|
105
|
+
flow_run: "FlowRun",
|
|
106
|
+
state: "State",
|
|
107
|
+
) -> tuple[tuple[Any, ...], dict[str, Any]]:
|
|
108
|
+
"""
|
|
109
|
+
Return the positional and keyword arguments to call a flow state hook with,
|
|
110
|
+
checking its signature without calling it.
|
|
111
|
+
|
|
112
|
+
A hook that names its parameters `flow`, `flow_run` (or `run`) and `state`
|
|
113
|
+
gets them by name, in any order and including keyword-only parameters.
|
|
114
|
+
Otherwise, a hook that takes three positional arguments gets them in that
|
|
115
|
+
order, whatever their names, and a hook that only takes keyword arguments
|
|
116
|
+
gets them by name.
|
|
117
|
+
|
|
118
|
+
Raises:
|
|
119
|
+
TypeError: if the hook accepts none of these forms.
|
|
120
|
+
"""
|
|
121
|
+
try:
|
|
122
|
+
signature = inspect.signature(hook)
|
|
123
|
+
except (TypeError, ValueError):
|
|
124
|
+
return (flow, flow_run, state), {}
|
|
125
|
+
|
|
126
|
+
def binds(*args: Any, **kwargs: Any) -> bool:
|
|
127
|
+
try:
|
|
128
|
+
signature.bind(*args, **kwargs)
|
|
129
|
+
except TypeError:
|
|
130
|
+
return False
|
|
131
|
+
return True
|
|
132
|
+
|
|
133
|
+
named = (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY)
|
|
134
|
+
for flow_run_name in ("flow_run", "run"):
|
|
135
|
+
kwargs = {"flow": flow, flow_run_name: flow_run, "state": state}
|
|
136
|
+
declared = all(
|
|
137
|
+
name in signature.parameters and signature.parameters[name].kind in named
|
|
138
|
+
for name in kwargs
|
|
139
|
+
)
|
|
140
|
+
if declared and binds(**kwargs):
|
|
141
|
+
return (), kwargs
|
|
142
|
+
|
|
143
|
+
if binds(flow, flow_run, state):
|
|
144
|
+
return (flow, flow_run, state), {}
|
|
145
|
+
|
|
146
|
+
kwargs = {"flow": flow, "flow_run": flow_run, "state": state}
|
|
147
|
+
if binds(**kwargs):
|
|
148
|
+
return (), kwargs
|
|
149
|
+
|
|
150
|
+
raise TypeError(
|
|
151
|
+
f"Hook {get_hook_name(hook)!r} must accept the flow, the flow run and the"
|
|
152
|
+
" state as three positional arguments or as parameters named `flow`,"
|
|
153
|
+
" `flow_run` (or `run`) and `state`"
|
|
154
|
+
)
|
{prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/client/schemas/objects.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import datetime
|
|
4
|
+
import json
|
|
4
5
|
import warnings
|
|
5
6
|
from collections.abc import Callable, Mapping
|
|
6
7
|
from enum import Enum
|
|
@@ -17,7 +18,6 @@ from typing import (
|
|
|
17
18
|
)
|
|
18
19
|
from uuid import UUID
|
|
19
20
|
|
|
20
|
-
import orjson
|
|
21
21
|
from pydantic import (
|
|
22
22
|
AfterValidator,
|
|
23
23
|
ConfigDict,
|
|
@@ -1768,7 +1768,7 @@ class FlowRunInput(ObjectBaseModel):
|
|
|
1768
1768
|
Returns:
|
|
1769
1769
|
Any: the decoded value
|
|
1770
1770
|
"""
|
|
1771
|
-
return
|
|
1771
|
+
return json.loads(self.value)
|
|
1772
1772
|
|
|
1773
1773
|
|
|
1774
1774
|
class GlobalConcurrencyLimit(ObjectBaseModel):
|
|
@@ -59,7 +59,11 @@ from prefect._internal.control_listener import (
|
|
|
59
59
|
get_intent,
|
|
60
60
|
report_engine_outcome,
|
|
61
61
|
)
|
|
62
|
-
from prefect._internal.engine import
|
|
62
|
+
from prefect._internal.engine import (
|
|
63
|
+
get_hook_name,
|
|
64
|
+
resolve_custom_flow_run_name,
|
|
65
|
+
resolve_flow_hook_arguments,
|
|
66
|
+
)
|
|
63
67
|
from prefect._internal.metrics import RunMetrics
|
|
64
68
|
from prefect.client.orchestration import PrefectClient, SyncPrefectClient, get_client
|
|
65
69
|
from prefect.client.schemas import FlowRun, TaskRun
|
|
@@ -1072,7 +1076,8 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1072
1076
|
f"Running hook {hook_name!r} in response to entering state"
|
|
1073
1077
|
f" {state.name!r}"
|
|
1074
1078
|
)
|
|
1075
|
-
|
|
1079
|
+
args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
|
|
1080
|
+
result = hook(*args, **kwargs)
|
|
1076
1081
|
if asyncio.iscoroutine(result):
|
|
1077
1082
|
run_coro_as_sync(result)
|
|
1078
1083
|
except Exception:
|
|
@@ -1803,7 +1808,8 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1803
1808
|
f"Running hook {hook_name!r} in response to entering state"
|
|
1804
1809
|
f" {state.name!r}"
|
|
1805
1810
|
)
|
|
1806
|
-
|
|
1811
|
+
args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
|
|
1812
|
+
result = hook(*args, **kwargs)
|
|
1807
1813
|
if asyncio.iscoroutine(result):
|
|
1808
1814
|
await result
|
|
1809
1815
|
except Exception:
|
|
@@ -121,15 +121,22 @@ F = TypeVar("F", bound="Flow[Any, Any]") # The type of the flow
|
|
|
121
121
|
class FlowStateHook(Protocol, Generic[P, R]):
|
|
122
122
|
"""
|
|
123
123
|
A callable that is invoked when a flow enters a given state.
|
|
124
|
+
|
|
125
|
+
It receives the flow, the flow run, and the state as its first three
|
|
126
|
+
parameters, whatever their names. A hook whose parameters are named `flow`,
|
|
127
|
+
`flow_run` (or `run`), and `state` receives them by name instead.
|
|
124
128
|
"""
|
|
125
129
|
|
|
126
130
|
__name__: str
|
|
127
131
|
|
|
128
132
|
def __call__(
|
|
129
|
-
self, flow: Flow[P, R], flow_run: FlowRun, state: State
|
|
133
|
+
self, flow: Flow[P, R], flow_run: FlowRun, state: State, /
|
|
130
134
|
) -> Awaitable[None] | None: ...
|
|
131
135
|
|
|
132
136
|
|
|
137
|
+
_FlowStateHookT = TypeVar("_FlowStateHookT", bound="FlowStateHook[..., Any]")
|
|
138
|
+
|
|
139
|
+
|
|
133
140
|
if TYPE_CHECKING:
|
|
134
141
|
import logging
|
|
135
142
|
|
|
@@ -593,6 +600,11 @@ class Flow(Generic[P, R]):
|
|
|
593
600
|
Validate parameters for compatibility with the flow by attempting to cast the inputs to the
|
|
594
601
|
associated types specified by the function's type annotations.
|
|
595
602
|
|
|
603
|
+
Resolve saved block references by UUID or by a dictionary containing
|
|
604
|
+
`block_document_id` or `block_document_slug`. UUID strings, including UUID
|
|
605
|
+
URNs, retain their block-reference meaning. Other `$ref` values, such as
|
|
606
|
+
JSON Schema paths and URLs, are preserved as parameter data.
|
|
607
|
+
|
|
596
608
|
Returns:
|
|
597
609
|
A new dict of parameters that have been cast to the appropriate types
|
|
598
610
|
|
|
@@ -601,11 +613,24 @@ class Flow(Generic[P, R]):
|
|
|
601
613
|
"""
|
|
602
614
|
|
|
603
615
|
def resolve_block_reference(data: Any | dict[str, Any]) -> Any:
|
|
604
|
-
if isinstance(data, dict)
|
|
605
|
-
|
|
616
|
+
if not isinstance(data, dict) or "$ref" not in data:
|
|
617
|
+
return data
|
|
618
|
+
|
|
619
|
+
ref = data["$ref"]
|
|
620
|
+
if isinstance(ref, str):
|
|
621
|
+
try:
|
|
622
|
+
UUID(ref)
|
|
623
|
+
except ValueError:
|
|
624
|
+
return data
|
|
625
|
+
elif not isinstance(ref, UUID) and not (
|
|
626
|
+
isinstance(ref, dict)
|
|
627
|
+
and ("block_document_id" in ref or "block_document_slug" in ref)
|
|
628
|
+
):
|
|
629
|
+
return data
|
|
630
|
+
|
|
631
|
+
from prefect.blocks.core import Block
|
|
606
632
|
|
|
607
|
-
|
|
608
|
-
return data
|
|
633
|
+
return Block.load_from_ref(ref, _sync=True)
|
|
609
634
|
|
|
610
635
|
try:
|
|
611
636
|
parameters = visit_collection(
|
|
@@ -1004,23 +1029,23 @@ class Flow(Generic[P, R]):
|
|
|
1004
1029
|
_sla=_sla,
|
|
1005
1030
|
)
|
|
1006
1031
|
|
|
1007
|
-
def on_completion(self, fn:
|
|
1032
|
+
def on_completion(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1008
1033
|
self.on_completion_hooks.append(fn)
|
|
1009
1034
|
return fn
|
|
1010
1035
|
|
|
1011
|
-
def on_cancellation(self, fn:
|
|
1036
|
+
def on_cancellation(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1012
1037
|
self.on_cancellation_hooks.append(fn)
|
|
1013
1038
|
return fn
|
|
1014
1039
|
|
|
1015
|
-
def on_crashed(self, fn:
|
|
1040
|
+
def on_crashed(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1016
1041
|
self.on_crashed_hooks.append(fn)
|
|
1017
1042
|
return fn
|
|
1018
1043
|
|
|
1019
|
-
def on_running(self, fn:
|
|
1044
|
+
def on_running(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1020
1045
|
self.on_running_hooks.append(fn)
|
|
1021
1046
|
return fn
|
|
1022
1047
|
|
|
1023
|
-
def on_failure(self, fn:
|
|
1048
|
+
def on_failure(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1024
1049
|
self.on_failure_hooks.append(fn)
|
|
1025
1050
|
return fn
|
|
1026
1051
|
|
|
@@ -215,7 +215,7 @@ class CoiledPushProvisioner:
|
|
|
215
215
|
else:
|
|
216
216
|
raise RuntimeError(
|
|
217
217
|
"Coiled credentials not found. Please create a new token by"
|
|
218
|
-
" running
|
|
218
|
+
" running `coiled login` and try again."
|
|
219
219
|
)
|
|
220
220
|
|
|
221
221
|
# Create the credentials block
|
|
@@ -220,7 +220,7 @@ class ModalPushProvisioner:
|
|
|
220
220
|
else:
|
|
221
221
|
raise RuntimeError(
|
|
222
222
|
"Modal credentials not found. Please create a new token by"
|
|
223
|
-
" running
|
|
223
|
+
" running `modal token new` and try again."
|
|
224
224
|
)
|
|
225
225
|
|
|
226
226
|
# Create the credentials block
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import json
|
|
1
2
|
from typing import TYPE_CHECKING, Any, Optional, Set
|
|
2
3
|
from uuid import UUID
|
|
3
4
|
|
|
@@ -236,7 +237,7 @@ async def aread_flow_run_input(
|
|
|
236
237
|
return None
|
|
237
238
|
raise
|
|
238
239
|
else:
|
|
239
|
-
return
|
|
240
|
+
return json.loads(value)
|
|
240
241
|
|
|
241
242
|
|
|
242
243
|
@async_dispatch(aread_flow_run_input)
|
|
@@ -261,7 +262,7 @@ def read_flow_run_input(key: str, flow_run_id: Optional[UUID] = None) -> Any:
|
|
|
261
262
|
return None
|
|
262
263
|
raise
|
|
263
264
|
else:
|
|
264
|
-
return
|
|
265
|
+
return json.loads(value)
|
|
265
266
|
|
|
266
267
|
|
|
267
268
|
@client_injector
|
|
@@ -194,13 +194,18 @@ class FileSystemLockManager(LockManager):
|
|
|
194
194
|
|
|
195
195
|
def release_lock(self, key: str, holder: str) -> None:
|
|
196
196
|
lock_path = self._lock_path_for_key(key)
|
|
197
|
-
if not self.is_locked(key):
|
|
198
|
-
raise ValueError(f"No lock for transaction with key {key}")
|
|
199
197
|
if self.is_lock_holder(key, holder):
|
|
200
198
|
Path(lock_path).unlink(missing_ok=True)
|
|
201
199
|
self._locks.pop(key, None)
|
|
202
|
-
|
|
203
|
-
|
|
200
|
+
return
|
|
201
|
+
if not self.is_locked(key):
|
|
202
|
+
# The lock was already released or expired (e.g. its hold timeout
|
|
203
|
+
# elapsed or it was released during a task retry) — including
|
|
204
|
+
# between the checks above — so releasing it is a no-op, matching
|
|
205
|
+
# RedisLockManager.
|
|
206
|
+
self._locks.pop(key, None)
|
|
207
|
+
return
|
|
208
|
+
raise ValueError(f"No lock held by {holder} for transaction with key {key}")
|
|
204
209
|
|
|
205
210
|
def is_locked(self, key: str, use_cache: bool = False) -> bool:
|
|
206
211
|
if (lock_info := self._get_lock_info(key, use_cache=use_cache)) is None:
|
|
@@ -180,13 +180,18 @@ class MemoryLockManager(LockManager):
|
|
|
180
180
|
|
|
181
181
|
def release_lock(self, key: str, holder: str) -> None:
|
|
182
182
|
with self._locks_dict_lock:
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
) is not None:
|
|
183
|
+
lock_info = self._locks.get(key)
|
|
184
|
+
if lock_info is not None and lock_info["holder"] == holder:
|
|
185
|
+
if (expiration_timer := lock_info["expiration_timer"]) is not None:
|
|
187
186
|
expiration_timer.cancel()
|
|
188
|
-
|
|
187
|
+
if lock_info["lock"].locked():
|
|
188
|
+
lock_info["lock"].release()
|
|
189
189
|
del self._locks[key]
|
|
190
|
+
elif lock_info is None or not lock_info["lock"].locked():
|
|
191
|
+
# The lock was already released or expired (e.g. its hold
|
|
192
|
+
# timeout elapsed or it was released during a task retry);
|
|
193
|
+
# releasing it is a no-op, matching RedisLockManager.
|
|
194
|
+
return
|
|
190
195
|
else:
|
|
191
196
|
raise ValueError(
|
|
192
197
|
f"No lock held by {holder} for transaction with key {key}"
|
|
@@ -61,10 +61,16 @@ class LockManager(Protocol):
|
|
|
61
61
|
"""
|
|
62
62
|
Releases the lock on the corresponding transaction record.
|
|
63
63
|
|
|
64
|
+
If the lock no longer exists (e.g. it expired or was already released),
|
|
65
|
+
this method is a no-op.
|
|
66
|
+
|
|
64
67
|
Args:
|
|
65
68
|
key: Unique identifier for the transaction record.
|
|
66
69
|
holder: Unique identifier for the holder of the lock. Must match the
|
|
67
70
|
holder provided when acquiring the lock.
|
|
71
|
+
|
|
72
|
+
Raises:
|
|
73
|
+
ValueError: If the lock is held by a different holder.
|
|
68
74
|
"""
|
|
69
75
|
...
|
|
70
76
|
|
|
@@ -142,6 +142,8 @@ These validations exist to prevent git argument injection. Do not bypass them wh
|
|
|
142
142
|
|
|
143
143
|
**Automatic dependency installation:** By default, `WorkspaceResolvingEngineCommandStarter` does not install dependencies before starting a flow run. When no explicit command is passed and `PREFECT_RUNNER_AUTO_INSTALL_DEPENDENCIES` is true, it auto-selects `uv run --no-default-groups --project <project_root>` with the worker-supplied workspace bootstrap — but only when all three conditions hold: `pyproject.toml` exists at `project_root`, the `project.dependencies` list includes `prefect`, and `uv` is found via the workspace's `PATH` env var (not the system PATH). The bootstrap uses the prepared entrypoint with `prefect.flow_engine` when that module exposes its executable `_main`; older selected runtimes fall back to `prefect.engine` with `PREFECT__FLOW_ENTRYPOINT`, preserving the prepared workspace. If the setting is false or any condition fails, the command falls back to `None`. Explicit commands always take precedence.
|
|
144
144
|
|
|
145
|
+
**Version skew in the runtime bootstrap:** `_workspace_runtime_bootstrap.py` runs inside the flow's selected runtime, which may ship an older Prefect than the worker. Do not make it depend on Prefect internals newer than that runtime; it keeps local copies instead. Its flow hook argument resolution is one such copy (see the hook-parity contract in `src/prefect/AGENTS.md`).
|
|
146
|
+
|
|
145
147
|
## Reference
|
|
146
148
|
|
|
147
149
|
Full refactor design and rationale: plans/completed/2026-02-18-runner-refactor.md
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Protocol
|
|
4
4
|
|
|
5
5
|
from prefect._internal.concurrency.api import create_call, from_async
|
|
6
|
-
from prefect._internal.engine import get_hook_name
|
|
6
|
+
from prefect._internal.engine import get_hook_name, resolve_flow_hook_arguments
|
|
7
7
|
from prefect.logging.loggers import flow_run_logger
|
|
8
8
|
from prefect.utilities.asyncutils import is_async_fn
|
|
9
9
|
|
|
@@ -35,12 +35,11 @@ async def _run_hooks(
|
|
|
35
35
|
hook_name,
|
|
36
36
|
state.name,
|
|
37
37
|
)
|
|
38
|
+
args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
|
|
38
39
|
if is_async_fn(hook):
|
|
39
|
-
await hook(
|
|
40
|
+
await hook(*args, **kwargs)
|
|
40
41
|
else:
|
|
41
|
-
await from_async.call_in_new_thread(
|
|
42
|
-
create_call(hook, flow=flow, flow_run=flow_run, state=state)
|
|
43
|
-
)
|
|
42
|
+
await from_async.call_in_new_thread(create_call(hook, *args, **kwargs))
|
|
44
43
|
except Exception:
|
|
45
44
|
logger.error(
|
|
46
45
|
"An error was encountered while running hook %r",
|
|
@@ -109,6 +109,52 @@ async def _load_flow(manifest: dict[str, Any]) -> Flow[Any, Any]:
|
|
|
109
109
|
return await _run_sync(load_function_and_convert_to_flow, entrypoint)
|
|
110
110
|
|
|
111
111
|
|
|
112
|
+
def _flow_hook_arguments(
|
|
113
|
+
hook: Callable[..., Any],
|
|
114
|
+
flow: Flow[Any, Any],
|
|
115
|
+
flow_run: FlowRun,
|
|
116
|
+
state: State,
|
|
117
|
+
) -> tuple[tuple[Any, ...], dict[str, Any]]:
|
|
118
|
+
# Same rule as `prefect._internal.engine.resolve_flow_hook_arguments`. This
|
|
119
|
+
# module runs with the flow's runtime, which may have an older Prefect
|
|
120
|
+
# without that function, so it keeps its own copy.
|
|
121
|
+
try:
|
|
122
|
+
signature = inspect.signature(hook)
|
|
123
|
+
except (TypeError, ValueError):
|
|
124
|
+
return (flow, flow_run, state), {}
|
|
125
|
+
|
|
126
|
+
def binds(*args: Any, **kwargs: Any) -> bool:
|
|
127
|
+
try:
|
|
128
|
+
signature.bind(*args, **kwargs)
|
|
129
|
+
except TypeError:
|
|
130
|
+
return False
|
|
131
|
+
return True
|
|
132
|
+
|
|
133
|
+
named = (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY)
|
|
134
|
+
for flow_run_name in ("flow_run", "run"):
|
|
135
|
+
kwargs = {"flow": flow, flow_run_name: flow_run, "state": state}
|
|
136
|
+
declared = all(
|
|
137
|
+
name in signature.parameters and signature.parameters[name].kind in named
|
|
138
|
+
for name in kwargs
|
|
139
|
+
)
|
|
140
|
+
if declared and binds(**kwargs):
|
|
141
|
+
return (), kwargs
|
|
142
|
+
|
|
143
|
+
if binds(flow, flow_run, state):
|
|
144
|
+
return (flow, flow_run, state), {}
|
|
145
|
+
|
|
146
|
+
kwargs = {"flow": flow, "flow_run": flow_run, "state": state}
|
|
147
|
+
if binds(**kwargs):
|
|
148
|
+
return (), kwargs
|
|
149
|
+
|
|
150
|
+
hook_name = getattr(hook, "__name__", type(hook).__name__)
|
|
151
|
+
raise TypeError(
|
|
152
|
+
f"Hook {hook_name!r} must accept the flow, the flow run and the state as"
|
|
153
|
+
" three positional arguments or as parameters named `flow`, `flow_run`"
|
|
154
|
+
" (or `run`) and `state`"
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
112
158
|
async def _run_hooks(
|
|
113
159
|
hooks: list[Callable[..., Any]],
|
|
114
160
|
flow_run: FlowRun,
|
|
@@ -121,14 +167,8 @@ async def _run_hooks(
|
|
|
121
167
|
for hook in hooks:
|
|
122
168
|
hook_name = getattr(hook, "__name__", type(hook).__name__)
|
|
123
169
|
try:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
hook,
|
|
127
|
-
flow=flow,
|
|
128
|
-
flow_run=flow_run,
|
|
129
|
-
state=state,
|
|
130
|
-
)
|
|
131
|
-
)
|
|
170
|
+
args, kwargs = _flow_hook_arguments(hook, flow, flow_run, state)
|
|
171
|
+
result = await _run_sync(functools.partial(hook, *args, **kwargs))
|
|
132
172
|
if inspect.isawaitable(result):
|
|
133
173
|
await result
|
|
134
174
|
except Exception:
|
|
@@ -459,12 +459,27 @@ class GitRepository:
|
|
|
459
459
|
# read-only attribute first to avoid `[WinError 5] Access is denied`.
|
|
460
460
|
_clear_read_only_attributes(git_dir)
|
|
461
461
|
|
|
462
|
-
#
|
|
463
|
-
|
|
462
|
+
# Make the checkout match the configured directories. The destination
|
|
463
|
+
# can be reused by runs whose `directories` differ (a redeploy that
|
|
464
|
+
# changed the list, or deployments sharing a working directory), so
|
|
465
|
+
# an existing sparse checkout only grows: narrowing it would remove
|
|
466
|
+
# files that another run may still be using.
|
|
467
|
+
is_sparse = await self.is_sparsely_checked_out()
|
|
468
|
+
if self._directories:
|
|
464
469
|
await run_process(
|
|
465
|
-
[
|
|
470
|
+
[
|
|
471
|
+
"git",
|
|
472
|
+
"sparse-checkout",
|
|
473
|
+
"add" if is_sparse else "set",
|
|
474
|
+
"--",
|
|
475
|
+
*self._directories,
|
|
476
|
+
],
|
|
466
477
|
cwd=self.destination,
|
|
467
478
|
)
|
|
479
|
+
elif is_sparse:
|
|
480
|
+
await run_process(
|
|
481
|
+
["git", "sparse-checkout", "disable"], cwd=self.destination
|
|
482
|
+
)
|
|
468
483
|
|
|
469
484
|
self._logger.debug("Pulling latest changes from origin/%s", self._branch)
|
|
470
485
|
# Update the existing repository
|
{prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/deployments.py
RENAMED
|
@@ -440,6 +440,9 @@ async def update_deployment(
|
|
|
440
440
|
# Phase 2: Apply the actual updates. Renamed schedules use
|
|
441
441
|
# their row ID (slug is now NULL); others use slug as before.
|
|
442
442
|
for schedule in schedules_to_patch:
|
|
443
|
+
# A schedule sent with the deployment carries its full overrides, and
|
|
444
|
+
# `prefect deploy` leaves `parameters` out when there are none
|
|
445
|
+
schedule = schedule.model_copy(update={"parameters": schedule.parameters})
|
|
443
446
|
if schedule.replaces:
|
|
444
447
|
await models.deployments.update_deployment_schedule(
|
|
445
448
|
session=session,
|
|
@@ -581,7 +581,9 @@ async def resume_flow_run(
|
|
|
581
581
|
flow_run_input=schemas.core.FlowRunInput(
|
|
582
582
|
flow_run_id=flow_run_id,
|
|
583
583
|
key=keyset["response"],
|
|
584
|
-
value=
|
|
584
|
+
value=pydantic_core.to_json(run_input, inf_nan_mode="null").decode(
|
|
585
|
+
"utf-8"
|
|
586
|
+
),
|
|
585
587
|
),
|
|
586
588
|
)
|
|
587
589
|
|
|
@@ -367,9 +367,12 @@ def is_client_retryable_exception(exc: Exception) -> bool:
|
|
|
367
367
|
exc,
|
|
368
368
|
(
|
|
369
369
|
sqlalchemy.exc.DBAPIError,
|
|
370
|
+
sqlalchemy.exc.TimeoutError,
|
|
371
|
+
TimeoutError,
|
|
370
372
|
asyncpg.exceptions.QueryCanceledError,
|
|
371
373
|
asyncpg.exceptions.ConnectionDoesNotExistError,
|
|
372
374
|
asyncpg.exceptions.CannotConnectNowError,
|
|
375
|
+
asyncpg.exceptions.PostgresConnectionError,
|
|
373
376
|
sqlalchemy.exc.InvalidRequestError,
|
|
374
377
|
sqlalchemy.orm.exc.DetachedInstanceError,
|
|
375
378
|
),
|
{prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev5}/src/prefect/server/api/work_queues.py
RENAMED
|
@@ -201,24 +201,31 @@ async def read_work_queue_runs(
|
|
|
201
201
|
)
|
|
202
202
|
)
|
|
203
203
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
204
|
+
# Record every poll before background-task deduplication can discard it.
|
|
205
|
+
async with db.session_context(begin_transaction=True) as session:
|
|
206
|
+
await models.work_queues.record_work_queue_polls(
|
|
207
|
+
session=session,
|
|
208
|
+
polled_work_queue_ids=[work_queue_id],
|
|
209
|
+
ready_work_queue_ids=[],
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
if work_queue_becoming_ready:
|
|
213
|
+
await schedule_readiness_update(
|
|
214
|
+
docket,
|
|
215
|
+
mark_work_queues_ready,
|
|
216
|
+
key=f"mark_work_queues_ready:{work_queue_id}",
|
|
217
|
+
becoming_ready=True,
|
|
218
|
+
)(
|
|
219
|
+
polled_work_queue_ids=[],
|
|
220
|
+
ready_work_queue_ids=[work_queue_id],
|
|
221
|
+
)
|
|
213
222
|
|
|
214
223
|
await schedule_readiness_update(
|
|
215
224
|
docket,
|
|
216
225
|
mark_deployments_ready,
|
|
217
226
|
key=f"mark_deployments_ready:work_queue:{work_queue_id}",
|
|
218
227
|
becoming_ready=deployments_becoming_ready,
|
|
219
|
-
)(
|
|
220
|
-
work_queue_ids=[work_queue_id],
|
|
221
|
-
)
|
|
228
|
+
)(work_queue_ids=[work_queue_id], skip_recently_polled=True)
|
|
222
229
|
|
|
223
230
|
return flow_runs
|
|
224
231
|
|
|
@@ -897,32 +897,35 @@ async def get_scheduled_flow_runs(
|
|
|
897
897
|
limit=limit,
|
|
898
898
|
)
|
|
899
899
|
|
|
900
|
+
polled_queue_ids = [wq.id for wq in work_queues]
|
|
901
|
+
# Record every poll before background-task deduplication can discard it.
|
|
902
|
+
async with db.session_context(begin_transaction=True) as session:
|
|
903
|
+
await models.work_queues.record_work_queue_polls(
|
|
904
|
+
session=session,
|
|
905
|
+
polled_work_queue_ids=polled_queue_ids,
|
|
906
|
+
ready_work_queue_ids=[],
|
|
907
|
+
)
|
|
908
|
+
|
|
900
909
|
# Filtered polls only carry their own queues, so scope their keys to those
|
|
901
910
|
# queues; otherwise a poll for one subset could replace another's update.
|
|
902
911
|
key_scope = f"work_pool:{work_pool_id}"
|
|
903
912
|
if work_queue_ids is not None:
|
|
904
913
|
key_scope += ":" + ",".join(sorted(str(id) for id in set(work_queue_ids)))
|
|
905
914
|
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
polled_work_queue_ids=[
|
|
913
|
-
wq.id for wq in work_queues if wq.status != WorkQueueStatus.NOT_READY
|
|
914
|
-
],
|
|
915
|
-
ready_work_queue_ids=ready_work_queue_ids,
|
|
916
|
-
)
|
|
915
|
+
if ready_work_queue_ids:
|
|
916
|
+
await schedule_readiness_update(
|
|
917
|
+
docket,
|
|
918
|
+
mark_work_queues_ready,
|
|
919
|
+
key=f"mark_work_queues_ready:{key_scope}",
|
|
920
|
+
becoming_ready=True,
|
|
921
|
+
)(polled_work_queue_ids=[], ready_work_queue_ids=ready_work_queue_ids)
|
|
917
922
|
|
|
918
923
|
await schedule_readiness_update(
|
|
919
924
|
docket,
|
|
920
925
|
mark_deployments_ready,
|
|
921
926
|
key=f"mark_deployments_ready:{key_scope}",
|
|
922
927
|
becoming_ready=deployments_becoming_ready,
|
|
923
|
-
)(
|
|
924
|
-
work_queue_ids=[wq.id for wq in work_queues],
|
|
925
|
-
)
|
|
928
|
+
)(work_queue_ids=polled_queue_ids, skip_recently_polled=True)
|
|
926
929
|
|
|
927
930
|
return queue_response
|
|
928
931
|
|