prefect-client 3.9.2.dev4__tar.gz → 3.9.2.dev6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/PKG-INFO +1 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/AGENTS.md +1 -0
- prefect_client-3.9.2.dev6/src/prefect/_build_info.py +5 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/engine.py +59 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/objects.py +2 -2
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/flow_engine.py +57 -23
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/flows.py +35 -10
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/coiled.py +1 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/modal.py +1 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/input/actions.py +3 -2
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/filesystem.py +9 -4
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/memory.py +10 -5
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/protocol.py +6 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/AGENTS.md +2 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_hook_runner.py +4 -5
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_runtime_bootstrap.py +48 -8
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/storage.py +18 -3
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/deployments.py +3 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/flow_runs.py +3 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/server.py +3 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/work_queues.py +19 -12
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/workers.py +17 -14
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/task_runners.py +10 -1
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/callables/__init__.py +6 -3
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/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.dev6}/.gitignore +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/LICENSE +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/README.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/hatch_build.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/pyproject.toml +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/__main__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/_observation_delivery.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/attempt_control.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/server_maintenance.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/agent.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/automations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/engine.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/related.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/futures.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/main.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/plugins.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/py.typed +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/results.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_uv_command.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_hook_runner.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_runtime.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/_workspace_supervisor.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/schedules.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/serializers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/observed_states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/_types.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/states.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/tasks.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/transactions.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/_datetime_deprecations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/types/names.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/variables.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.9.2.dev4 → prefect_client-3.9.2.dev6}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.9.2.
|
|
3
|
+
Version: 3.9.2.dev6
|
|
4
4
|
Summary: Workflow orchestration and management.
|
|
5
5
|
Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
|
|
6
6
|
Project-URL: Documentation, https://www.prefect.io/docs
|
|
@@ -41,6 +41,7 @@ Runtime flow/task parameter values must come from `utilities.callables.get_call_
|
|
|
41
41
|
- **`ResultRecordMetadata` tolerates unknown serializer types.** When loading persisted metadata, an unrecognized serializer `type` is converted to an `UnknownSerializer` placeholder rather than raising `ValidationError`. This allows inspecting result metadata when the serializer implementation is unavailable in the current environment. However, known serializer types with invalid fields still raise `ValidationError`. `UnknownSerializer.dumps()` and `UnknownSerializer.loads()` raise `RuntimeError` — the tolerance is for inspection only, not actual serialization/deserialization.
|
|
42
42
|
- **`ResultRecord` must be marked persisted after every storage write.** `ResultStore` calls `mark_persisted()` on every record it writes; `to_state_create` in `states.py` consults `is_persisted` as a fallback when `should_persist_result()` returns `False` (e.g., after run context teardown). Any new sync or async persist path that omits `mark_persisted()` will silently drop state metadata for already-written results.
|
|
43
43
|
- **Flow-run suspension is enforced at orchestration boundaries.** Suspension is delivered via `FlowRunSuspensionRequest` and raised with `raise_if_flow_run_suspension_requested()`. When changing engines, futures, task runners, or generator execution, check before returning control to flow user code or proposing a flow state that could leave `Suspended`; keep sync/async paths aligned and avoid per-boundary API reads.
|
|
44
|
+
- **Flow state hooks accept the same signatures on every execution path.** The sync and async flow engines and `runner/_hook_runner.py` share `_internal/engine.py::resolve_flow_hook_arguments`; `runner/_workspace_runtime_bootstrap.py` keeps its own copy because it may run under an older Prefect. Change the shared function and the copy together.
|
|
44
45
|
- **Subflow tracking tasks use UUID dynamic keys when called from within a submitted task.** `flow_engine.py` marks the synthetic tracking `Task` with `_is_subflow_tracking_task=True`; `tasks.py` checks this flag to assign UUID-based (unstable) `dynamic_key` values when the tracking task runs inside a submitted task context. This prevents key collisions between concurrent sibling subflows on parent-flow retry. Direct subflow calls (no enclosing task context) keep stable sequential keys to preserve the retry optimization that reuses completed subflow results.
|
|
45
46
|
|
|
46
47
|
## Logging
|
|
@@ -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.dev6}/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):
|
|
@@ -11,7 +11,7 @@ import signal
|
|
|
11
11
|
import sys
|
|
12
12
|
import threading
|
|
13
13
|
import time
|
|
14
|
-
from collections.abc import Mapping
|
|
14
|
+
from collections.abc import Callable, Mapping
|
|
15
15
|
from contextlib import (
|
|
16
16
|
AsyncExitStack,
|
|
17
17
|
ExitStack,
|
|
@@ -59,7 +59,11 @@ from prefect._internal.control_listener import (
|
|
|
59
59
|
get_intent,
|
|
60
60
|
report_engine_outcome,
|
|
61
61
|
)
|
|
62
|
-
from prefect._internal.engine import
|
|
62
|
+
from prefect._internal.engine import (
|
|
63
|
+
get_hook_name,
|
|
64
|
+
resolve_custom_flow_run_name,
|
|
65
|
+
resolve_flow_hook_arguments,
|
|
66
|
+
)
|
|
63
67
|
from prefect._internal.metrics import RunMetrics
|
|
64
68
|
from prefect.client.orchestration import PrefectClient, SyncPrefectClient, get_client
|
|
65
69
|
from prefect.client.schemas import FlowRun, TaskRun
|
|
@@ -330,28 +334,40 @@ def _send_heartbeats(
|
|
|
330
334
|
resource, related = engine._build_heartbeat_event_template()
|
|
331
335
|
|
|
332
336
|
stop_event = threading.Event()
|
|
337
|
+
# The heartbeat thread checks for a stop and emits while holding this lock,
|
|
338
|
+
# so once `stop_heartbeats` returns, no heartbeat is mid-emit and none will
|
|
339
|
+
# be emitted.
|
|
340
|
+
emit_lock = threading.Lock()
|
|
333
341
|
|
|
334
|
-
def
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
if (
|
|
338
|
-
engine.flow_run
|
|
339
|
-
and engine.flow_run.state
|
|
340
|
-
and engine.flow_run.state.is_final()
|
|
341
|
-
):
|
|
342
|
-
engine.logger.debug("Flow run in terminal state, stopping heartbeat")
|
|
343
|
-
return
|
|
344
|
-
|
|
345
|
-
try:
|
|
346
|
-
engine._emit_flow_run_heartbeat(resource, related)
|
|
347
|
-
except Exception:
|
|
348
|
-
engine.logger.debug("Failed to emit heartbeat", exc_info=True)
|
|
342
|
+
def stop_heartbeats() -> None:
|
|
343
|
+
with emit_lock:
|
|
344
|
+
stop_event.set()
|
|
349
345
|
|
|
350
|
-
|
|
351
|
-
|
|
346
|
+
def heartbeat_loop() -> None:
|
|
347
|
+
while True:
|
|
348
|
+
with emit_lock:
|
|
352
349
|
if stop_event.is_set():
|
|
353
350
|
return
|
|
354
|
-
|
|
351
|
+
|
|
352
|
+
# Check state before emitting - don't emit if final
|
|
353
|
+
if (
|
|
354
|
+
engine.flow_run
|
|
355
|
+
and engine.flow_run.state
|
|
356
|
+
and engine.flow_run.state.is_final()
|
|
357
|
+
):
|
|
358
|
+
engine.logger.debug(
|
|
359
|
+
"Flow run in terminal state, stopping heartbeat"
|
|
360
|
+
)
|
|
361
|
+
return
|
|
362
|
+
|
|
363
|
+
try:
|
|
364
|
+
engine._emit_flow_run_heartbeat(resource, related)
|
|
365
|
+
except Exception:
|
|
366
|
+
engine.logger.debug("Failed to emit heartbeat", exc_info=True)
|
|
367
|
+
|
|
368
|
+
# Waiting on the event wakes the thread as soon as heartbeats stop
|
|
369
|
+
if stop_event.wait(heartbeat_seconds):
|
|
370
|
+
return
|
|
355
371
|
|
|
356
372
|
# Copy the current context so the heartbeat thread sees the same
|
|
357
373
|
# `SettingsContext` (and therefore the same `PREFECT_API_URL`) as the
|
|
@@ -366,13 +382,14 @@ def _send_heartbeats(
|
|
|
366
382
|
thread = threading.Thread(
|
|
367
383
|
target=heartbeat_ctx.run, args=(heartbeat_loop,), daemon=True
|
|
368
384
|
)
|
|
385
|
+
engine._stop_heartbeats = stop_heartbeats
|
|
369
386
|
thread.start()
|
|
370
387
|
engine.logger.debug("Started flow run heartbeat context")
|
|
371
388
|
|
|
372
389
|
try:
|
|
373
390
|
yield
|
|
374
391
|
finally:
|
|
375
|
-
|
|
392
|
+
stop_heartbeats()
|
|
376
393
|
if join_on_exit:
|
|
377
394
|
thread.join(timeout=2)
|
|
378
395
|
engine.logger.debug("Stopped flow run heartbeat context")
|
|
@@ -424,6 +441,15 @@ class BaseFlowRunEngine(Generic[P, R]):
|
|
|
424
441
|
default_factory=FlowRunSuspensionRequest
|
|
425
442
|
)
|
|
426
443
|
_attempt_conclusion: EngineOutcomeReceipt | None = field(default=None, init=False)
|
|
444
|
+
# Stops the heartbeat thread started by the most recent `_send_heartbeats`.
|
|
445
|
+
# `set_state` calls it before proposing a terminal state: the server
|
|
446
|
+
# timestamps that state when it accepts it, but the heartbeat thread sees
|
|
447
|
+
# it only after the response arrives. A heartbeat sent in that gap occurs
|
|
448
|
+
# after the terminal state, and an automation that expects every heartbeat
|
|
449
|
+
# to be followed by another event then fires on the finished run.
|
|
450
|
+
_stop_heartbeats: Callable[[], None] | None = field(
|
|
451
|
+
default=None, init=False, repr=False
|
|
452
|
+
)
|
|
427
453
|
|
|
428
454
|
def __post_init__(self) -> None:
|
|
429
455
|
if self.flow is None and self.flow_run_id is None:
|
|
@@ -757,6 +783,9 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
757
783
|
if self.short_circuit:
|
|
758
784
|
return self.state
|
|
759
785
|
|
|
786
|
+
if state.is_final() and self._stop_heartbeats is not None:
|
|
787
|
+
self._stop_heartbeats()
|
|
788
|
+
|
|
760
789
|
state = propose_state_sync(
|
|
761
790
|
self.client, state, flow_run_id=self.flow_run.id, force=force
|
|
762
791
|
) # type: ignore
|
|
@@ -1072,7 +1101,8 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1072
1101
|
f"Running hook {hook_name!r} in response to entering state"
|
|
1073
1102
|
f" {state.name!r}"
|
|
1074
1103
|
)
|
|
1075
|
-
|
|
1104
|
+
args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
|
|
1105
|
+
result = hook(*args, **kwargs)
|
|
1076
1106
|
if asyncio.iscoroutine(result):
|
|
1077
1107
|
run_coro_as_sync(result)
|
|
1078
1108
|
except Exception:
|
|
@@ -1495,6 +1525,9 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1495
1525
|
if self.short_circuit:
|
|
1496
1526
|
return self.state
|
|
1497
1527
|
|
|
1528
|
+
if state.is_final() and self._stop_heartbeats is not None:
|
|
1529
|
+
self._stop_heartbeats()
|
|
1530
|
+
|
|
1498
1531
|
state = await propose_state(
|
|
1499
1532
|
self.client, state, flow_run_id=self.flow_run.id, force=force
|
|
1500
1533
|
) # type: ignore
|
|
@@ -1803,7 +1836,8 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1803
1836
|
f"Running hook {hook_name!r} in response to entering state"
|
|
1804
1837
|
f" {state.name!r}"
|
|
1805
1838
|
)
|
|
1806
|
-
|
|
1839
|
+
args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
|
|
1840
|
+
result = hook(*args, **kwargs)
|
|
1807
1841
|
if asyncio.iscoroutine(result):
|
|
1808
1842
|
await result
|
|
1809
1843
|
except Exception:
|
|
@@ -121,15 +121,22 @@ F = TypeVar("F", bound="Flow[Any, Any]") # The type of the flow
|
|
|
121
121
|
class FlowStateHook(Protocol, Generic[P, R]):
|
|
122
122
|
"""
|
|
123
123
|
A callable that is invoked when a flow enters a given state.
|
|
124
|
+
|
|
125
|
+
It receives the flow, the flow run, and the state as its first three
|
|
126
|
+
parameters, whatever their names. A hook whose parameters are named `flow`,
|
|
127
|
+
`flow_run` (or `run`), and `state` receives them by name instead.
|
|
124
128
|
"""
|
|
125
129
|
|
|
126
130
|
__name__: str
|
|
127
131
|
|
|
128
132
|
def __call__(
|
|
129
|
-
self, flow: Flow[P, R], flow_run: FlowRun, state: State
|
|
133
|
+
self, flow: Flow[P, R], flow_run: FlowRun, state: State, /
|
|
130
134
|
) -> Awaitable[None] | None: ...
|
|
131
135
|
|
|
132
136
|
|
|
137
|
+
_FlowStateHookT = TypeVar("_FlowStateHookT", bound="FlowStateHook[..., Any]")
|
|
138
|
+
|
|
139
|
+
|
|
133
140
|
if TYPE_CHECKING:
|
|
134
141
|
import logging
|
|
135
142
|
|
|
@@ -593,6 +600,11 @@ class Flow(Generic[P, R]):
|
|
|
593
600
|
Validate parameters for compatibility with the flow by attempting to cast the inputs to the
|
|
594
601
|
associated types specified by the function's type annotations.
|
|
595
602
|
|
|
603
|
+
Resolve saved block references by UUID or by a dictionary containing
|
|
604
|
+
`block_document_id` or `block_document_slug`. UUID strings, including UUID
|
|
605
|
+
URNs, retain their block-reference meaning. Other `$ref` values, such as
|
|
606
|
+
JSON Schema paths and URLs, are preserved as parameter data.
|
|
607
|
+
|
|
596
608
|
Returns:
|
|
597
609
|
A new dict of parameters that have been cast to the appropriate types
|
|
598
610
|
|
|
@@ -601,11 +613,24 @@ class Flow(Generic[P, R]):
|
|
|
601
613
|
"""
|
|
602
614
|
|
|
603
615
|
def resolve_block_reference(data: Any | dict[str, Any]) -> Any:
|
|
604
|
-
if isinstance(data, dict)
|
|
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.dev6}/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
|
),
|