prefect-client 3.8.1.dev4__tar.gz → 3.8.2.dev1__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.8.1.dev4 → prefect_client-3.8.2.dev1}/PKG-INFO +2 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/pyproject.toml +1 -1
- prefect_client-3.8.2.dev1/src/prefect/_build_info.py +5 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/control_listener.py +4 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/observers.py +188 -27
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/core.py +8 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +56 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/filters.py +26 -20
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/AGENTS.md +1 -1
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/runner.py +67 -7
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/engine.py +6 -8
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/flow_engine.py +16 -22
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/AGENTS.md +2 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_control_channel.py +9 -8
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_process_manager.py +33 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_starter_engine.py +5 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_workspace_starter.py +3 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/processutils/__init__.py +24 -3
- prefect_client-3.8.1.dev4/src/prefect/_build_info.py +0 -5
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/.gitignore +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/LICENSE +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/README.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/hatch_build.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/__main__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/agent.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/automations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/related.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/flows.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/futures.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/main.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/plugins.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/py.typed +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/results.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/schedules.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/serializers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/_types.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/states.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/tasks.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/transactions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/names.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/variables.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.8.
|
|
3
|
+
Version: 3.8.2.dev1
|
|
4
4
|
Summary: Workflow orchestration and management.
|
|
5
5
|
Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
|
|
6
6
|
Project-URL: Documentation, https://docs.prefect.io
|
|
@@ -22,7 +22,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries
|
|
23
23
|
Requires-Python: <3.15,>=3.10
|
|
24
24
|
Requires-Dist: amplitude-analytics<2.0.0,>=1.2.1
|
|
25
|
-
Requires-Dist: anyio
|
|
25
|
+
Requires-Dist: anyio<5.0.0,>=4.4.0
|
|
26
26
|
Requires-Dist: asgi-lifespan<3.0,>=1.0
|
|
27
27
|
Requires-Dist: cachetools<8.0,>=5.3
|
|
28
28
|
Requires-Dist: cloudpickle<4.0,>=2.0
|
{prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/control_listener.py
RENAMED
|
@@ -13,7 +13,7 @@ Protocol:
|
|
|
13
13
|
one-shot env vars without connecting yet.
|
|
14
14
|
3. The outermost `capture_sigterm()` calls `start()`, which connects back to
|
|
15
15
|
the runner and spawns a daemon thread blocked on the socket.
|
|
16
|
-
4. The runner writes a single-byte intent (`b"c"`
|
|
16
|
+
4. The runner writes a single-byte intent (`b"c"`, `b"r"` or `b"q"`).
|
|
17
17
|
5. If Prefect still owns the live SIGTERM bridge, the child writes `b"a"`,
|
|
18
18
|
commits the intent for engine dispatch, and on Windows triggers
|
|
19
19
|
`_thread.interrupt_main(SIGTERM)`.
|
|
@@ -37,10 +37,12 @@ from typing import Literal
|
|
|
37
37
|
|
|
38
38
|
from prefect.utilities.engine import commit_control_intent_and_ack
|
|
39
39
|
|
|
40
|
-
Intent = Literal["cancel"]
|
|
40
|
+
Intent = Literal["cancel", "reschedule", "relinquish"]
|
|
41
41
|
|
|
42
42
|
_INTENT_FOR_BYTE: dict[bytes, Intent] = {
|
|
43
43
|
b"c": "cancel",
|
|
44
|
+
b"r": "reschedule",
|
|
45
|
+
b"q": "relinquish",
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
_intent: Intent | None = None
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import logging
|
|
5
|
+
import time
|
|
4
6
|
import uuid
|
|
5
7
|
from contextlib import AsyncExitStack
|
|
8
|
+
from datetime import datetime
|
|
6
9
|
from typing import Any, Protocol
|
|
7
10
|
|
|
8
11
|
from prefect._flow_run_suspension import is_suspended_flow_run_state
|
|
@@ -17,9 +20,16 @@ from prefect.client.schemas.filters import (
|
|
|
17
20
|
from prefect.client.schemas.objects import State, StateType
|
|
18
21
|
from prefect.events.clients import PrefectEventSubscriber, get_events_subscriber
|
|
19
22
|
from prefect.events.filters import EventFilter, EventNameFilter
|
|
23
|
+
from prefect.exceptions import ObjectNotFound
|
|
20
24
|
from prefect.logging.loggers import get_logger
|
|
21
25
|
from prefect.utilities.services import critical_service_loop
|
|
22
26
|
|
|
27
|
+
# How long to wait before warning that a suspension state is still unavailable,
|
|
28
|
+
# how often to look initially, and the retry cap after the warning.
|
|
29
|
+
SUSPENSION_CONFIRMATION_WARNING_AFTER = 30.0
|
|
30
|
+
SUSPENSION_CONFIRMATION_INTERVAL = 0.5
|
|
31
|
+
SUSPENSION_CONFIRMATION_MAX_INTERVAL = 10.0
|
|
32
|
+
|
|
23
33
|
|
|
24
34
|
class OnCancellingCallback(Protocol):
|
|
25
35
|
def __call__(self, flow_run_id: uuid.UUID) -> None: ...
|
|
@@ -33,6 +43,133 @@ class OnFailureCallback(Protocol):
|
|
|
33
43
|
def __call__(self, flow_run_ids: set[uuid.UUID]) -> None: ...
|
|
34
44
|
|
|
35
45
|
|
|
46
|
+
class _SuspensionWatch:
|
|
47
|
+
"""Reconcile suspension events with durable states for one flow run."""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
flow_run_id: uuid.UUID,
|
|
52
|
+
client: PrefectClient,
|
|
53
|
+
on_suspended: OnSuspendedCallback,
|
|
54
|
+
logger: logging.Logger,
|
|
55
|
+
) -> None:
|
|
56
|
+
self.flow_run_id = flow_run_id
|
|
57
|
+
self.is_suspended = False
|
|
58
|
+
self._client = client
|
|
59
|
+
self._on_suspended = on_suspended
|
|
60
|
+
self._logger = logger
|
|
61
|
+
self._initialized = asyncio.Event()
|
|
62
|
+
self._replay_checkpoint: datetime | None = None
|
|
63
|
+
self._confirmation_tasks: dict[uuid.UUID, asyncio.Task[None]] = {}
|
|
64
|
+
self._closed = False
|
|
65
|
+
|
|
66
|
+
def initialize(self, state: State | None) -> None:
|
|
67
|
+
"""Set the initial server checkpoint and release waiting events."""
|
|
68
|
+
if not self._initialized.is_set():
|
|
69
|
+
self._replay_checkpoint = state.timestamp if state is not None else None
|
|
70
|
+
self._initialized.set()
|
|
71
|
+
self.notify_if_suspended(state)
|
|
72
|
+
|
|
73
|
+
def notify_if_suspended(self, state: State | None) -> None:
|
|
74
|
+
if (
|
|
75
|
+
not self.is_suspended
|
|
76
|
+
and state is not None
|
|
77
|
+
and is_suspended_flow_run_state(state)
|
|
78
|
+
):
|
|
79
|
+
self.is_suspended = True
|
|
80
|
+
self._on_suspended(self.flow_run_id, state)
|
|
81
|
+
|
|
82
|
+
def observe(self, state_id: uuid.UUID, occurred: datetime) -> None:
|
|
83
|
+
"""Confirm a new suspension event without blocking event consumption."""
|
|
84
|
+
if self._closed or self.is_suspended:
|
|
85
|
+
return
|
|
86
|
+
if state_id in self._confirmation_tasks:
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
task = asyncio.create_task(self._confirm(state_id, occurred))
|
|
90
|
+
self._confirmation_tasks[state_id] = task
|
|
91
|
+
task.add_done_callback(
|
|
92
|
+
lambda completed, state_id=state_id: self._confirmation_done(
|
|
93
|
+
state_id, completed
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
async def _confirm(self, state_id: uuid.UUID, occurred: datetime) -> None:
|
|
98
|
+
await self._initialized.wait()
|
|
99
|
+
if self._closed or self.is_suspended:
|
|
100
|
+
return
|
|
101
|
+
if self._replay_checkpoint is not None and occurred <= self._replay_checkpoint:
|
|
102
|
+
self._logger.debug(
|
|
103
|
+
"Ignoring replayed suspension event for flow run %s that occurred"
|
|
104
|
+
" at or before the initial server state.",
|
|
105
|
+
self.flow_run_id,
|
|
106
|
+
)
|
|
107
|
+
return
|
|
108
|
+
|
|
109
|
+
warning_deadline = time.monotonic() + SUSPENSION_CONFIRMATION_WARNING_AFTER
|
|
110
|
+
retry_interval = SUSPENSION_CONFIRMATION_INTERVAL
|
|
111
|
+
warned = False
|
|
112
|
+
last_error: Exception | None = None
|
|
113
|
+
|
|
114
|
+
while not self._closed and not self.is_suspended:
|
|
115
|
+
try:
|
|
116
|
+
state = await self._client.read_flow_run_state(state_id)
|
|
117
|
+
except ObjectNotFound:
|
|
118
|
+
pass
|
|
119
|
+
except Exception as exc:
|
|
120
|
+
last_error = exc
|
|
121
|
+
else:
|
|
122
|
+
if state.state_details.flow_run_id not in (None, self.flow_run_id):
|
|
123
|
+
self._logger.warning(
|
|
124
|
+
"Suspension event for flow run %s referred to state %s owned"
|
|
125
|
+
" by flow run %s.",
|
|
126
|
+
self.flow_run_id,
|
|
127
|
+
state_id,
|
|
128
|
+
state.state_details.flow_run_id,
|
|
129
|
+
)
|
|
130
|
+
return
|
|
131
|
+
self.notify_if_suspended(state)
|
|
132
|
+
return
|
|
133
|
+
|
|
134
|
+
if not warned and time.monotonic() >= warning_deadline:
|
|
135
|
+
self._logger.warning(
|
|
136
|
+
"Received a suspension event for flow run %s, but state %s has"
|
|
137
|
+
" not become readable within %s seconds; continuing to retry.",
|
|
138
|
+
self.flow_run_id,
|
|
139
|
+
state_id,
|
|
140
|
+
SUSPENSION_CONFIRMATION_WARNING_AFTER,
|
|
141
|
+
exc_info=last_error,
|
|
142
|
+
)
|
|
143
|
+
warned = True
|
|
144
|
+
|
|
145
|
+
await asyncio.sleep(retry_interval)
|
|
146
|
+
if warned:
|
|
147
|
+
retry_interval = min(
|
|
148
|
+
max(retry_interval * 2, SUSPENSION_CONFIRMATION_INTERVAL),
|
|
149
|
+
SUSPENSION_CONFIRMATION_MAX_INTERVAL,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def _confirmation_done(self, state_id: uuid.UUID, task: asyncio.Task[None]) -> None:
|
|
153
|
+
self._confirmation_tasks.pop(state_id, None)
|
|
154
|
+
if task.cancelled():
|
|
155
|
+
return
|
|
156
|
+
if error := task.exception():
|
|
157
|
+
self._logger.error(
|
|
158
|
+
"Suspension confirmation failed for flow run %s and state %s.",
|
|
159
|
+
self.flow_run_id,
|
|
160
|
+
state_id,
|
|
161
|
+
exc_info=error,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
def cancel(self) -> tuple[asyncio.Task[None], ...]:
|
|
165
|
+
self._closed = True
|
|
166
|
+
tasks = tuple(self._confirmation_tasks.values())
|
|
167
|
+
self._confirmation_tasks.clear()
|
|
168
|
+
for task in tasks:
|
|
169
|
+
task.cancel()
|
|
170
|
+
return tasks
|
|
171
|
+
|
|
172
|
+
|
|
36
173
|
class FlowRunCancellingObserver:
|
|
37
174
|
def __init__(
|
|
38
175
|
self,
|
|
@@ -283,35 +420,59 @@ class FlowRunSuspendingObserver:
|
|
|
283
420
|
self._event_filter = EventFilter(
|
|
284
421
|
event=EventNameFilter(name=["prefect.flow-run.Suspended"])
|
|
285
422
|
)
|
|
286
|
-
self._in_flight_flow_run_ids: set[uuid.UUID] = set()
|
|
287
423
|
self._events_subscriber: PrefectEventSubscriber | None
|
|
288
424
|
self._exit_stack = AsyncExitStack()
|
|
289
425
|
self._consumer_task: asyncio.Task[None] | None = None
|
|
290
426
|
self._polling_task: asyncio.Task[None] | None = None
|
|
291
427
|
self._is_shutting_down = False
|
|
292
428
|
self._client: PrefectClient | None = None
|
|
293
|
-
self.
|
|
429
|
+
self._watches: dict[uuid.UUID, _SuspensionWatch] = {}
|
|
430
|
+
|
|
431
|
+
@property
|
|
432
|
+
def _in_flight_flow_run_ids(self) -> set[uuid.UUID]:
|
|
433
|
+
return set(self._watches)
|
|
294
434
|
|
|
295
435
|
def add_in_flight_flow_run_id(self, flow_run_id: uuid.UUID):
|
|
436
|
+
if self._client is None:
|
|
437
|
+
raise RuntimeError(
|
|
438
|
+
"Client not initialized. Please use `async with` to initialize the observer."
|
|
439
|
+
)
|
|
296
440
|
self.logger.debug("Adding in-flight flow run ID: %s", flow_run_id)
|
|
297
|
-
self.
|
|
441
|
+
if flow_run_id not in self._watches:
|
|
442
|
+
watch = self._watches[flow_run_id] = self._create_watch(flow_run_id)
|
|
443
|
+
watch.initialize(None)
|
|
444
|
+
|
|
445
|
+
def _create_watch(self, flow_run_id: uuid.UUID) -> _SuspensionWatch:
|
|
446
|
+
if self._client is None:
|
|
447
|
+
raise RuntimeError(
|
|
448
|
+
"Client not initialized. Please use `async with` to initialize the observer."
|
|
449
|
+
)
|
|
450
|
+
return _SuspensionWatch(
|
|
451
|
+
flow_run_id=flow_run_id,
|
|
452
|
+
client=self._client,
|
|
453
|
+
on_suspended=self.on_suspended,
|
|
454
|
+
logger=self.logger,
|
|
455
|
+
)
|
|
298
456
|
|
|
299
457
|
def remove_in_flight_flow_run_id(self, flow_run_id: uuid.UUID):
|
|
300
458
|
self.logger.debug("Removing in-flight flow run ID: %s", flow_run_id)
|
|
301
|
-
self.
|
|
302
|
-
|
|
459
|
+
if watch := self._watches.pop(flow_run_id, None):
|
|
460
|
+
watch.cancel()
|
|
303
461
|
|
|
304
462
|
async def watch_flow_run_id(self, flow_run_id: uuid.UUID) -> None:
|
|
305
|
-
self.add_in_flight_flow_run_id(flow_run_id)
|
|
306
463
|
if self._client is None:
|
|
307
464
|
raise RuntimeError(
|
|
308
465
|
"Client not initialized. Please use `async with` to initialize the observer."
|
|
309
466
|
)
|
|
467
|
+
self.logger.debug("Adding in-flight flow run ID: %s", flow_run_id)
|
|
468
|
+
if flow_run_id not in self._watches:
|
|
469
|
+
self._watches[flow_run_id] = self._create_watch(flow_run_id)
|
|
310
470
|
retry_interval = max(min(self.polling_interval, 1.0), 0.01)
|
|
311
471
|
attempts = 0
|
|
312
472
|
|
|
313
473
|
while not self._is_shutting_down:
|
|
314
|
-
|
|
474
|
+
watch = self._watches.get(flow_run_id)
|
|
475
|
+
if watch is None or watch.is_suspended:
|
|
315
476
|
return
|
|
316
477
|
|
|
317
478
|
try:
|
|
@@ -328,26 +489,14 @@ class FlowRunSuspendingObserver:
|
|
|
328
489
|
await asyncio.sleep(retry_interval)
|
|
329
490
|
continue
|
|
330
491
|
|
|
331
|
-
|
|
492
|
+
watch.initialize(flow_run.state)
|
|
332
493
|
return
|
|
333
494
|
|
|
334
495
|
def _notify_if_suspended_state(
|
|
335
496
|
self, flow_run_id: uuid.UUID, state: State | None
|
|
336
497
|
) -> None:
|
|
337
|
-
if
|
|
338
|
-
|
|
339
|
-
self.on_suspended(flow_run_id, state)
|
|
340
|
-
|
|
341
|
-
async def _notify_if_suspended(self, flow_run_id: uuid.UUID) -> None:
|
|
342
|
-
if self._client is None:
|
|
343
|
-
raise RuntimeError(
|
|
344
|
-
"Client not initialized. Please use `async with` to initialize the observer."
|
|
345
|
-
)
|
|
346
|
-
if flow_run_id in self._suspended_flow_run_ids:
|
|
347
|
-
return
|
|
348
|
-
|
|
349
|
-
flow_run = await self._client.read_flow_run(flow_run_id)
|
|
350
|
-
self._notify_if_suspended_state(flow_run_id, flow_run.state)
|
|
498
|
+
if watch := self._watches.get(flow_run_id):
|
|
499
|
+
watch.notify_if_suspended(state)
|
|
351
500
|
|
|
352
501
|
async def _consume_events(self):
|
|
353
502
|
if self._events_subscriber is None:
|
|
@@ -361,9 +510,14 @@ class FlowRunSuspendingObserver:
|
|
|
361
510
|
"prefect.flow-run.", ""
|
|
362
511
|
)
|
|
363
512
|
)
|
|
364
|
-
|
|
513
|
+
watch = self._watches.get(flow_run_id)
|
|
514
|
+
if watch is None:
|
|
365
515
|
continue
|
|
366
|
-
|
|
516
|
+
|
|
517
|
+
# State change events carry the ID of the state they report, so the
|
|
518
|
+
# event identifies the exact transition to confirm. Confirmation is
|
|
519
|
+
# done in a separate task to keep consuming events while we wait.
|
|
520
|
+
watch.observe(event.id, event.occurred)
|
|
367
521
|
except ValueError:
|
|
368
522
|
self.logger.warning(
|
|
369
523
|
"Received event with invalid flow run ID: %s",
|
|
@@ -412,7 +566,11 @@ class FlowRunSuspendingObserver:
|
|
|
412
566
|
"Client not initialized. Please use `async with` to initialize the observer."
|
|
413
567
|
)
|
|
414
568
|
|
|
415
|
-
flow_run_ids =
|
|
569
|
+
flow_run_ids = {
|
|
570
|
+
flow_run_id
|
|
571
|
+
for flow_run_id, watch in self._watches.items()
|
|
572
|
+
if not watch.is_suspended
|
|
573
|
+
}
|
|
416
574
|
if not flow_run_ids:
|
|
417
575
|
return
|
|
418
576
|
|
|
@@ -434,8 +592,7 @@ class FlowRunSuspendingObserver:
|
|
|
434
592
|
|
|
435
593
|
for flow_run in suspended_flow_runs:
|
|
436
594
|
if flow_run.state:
|
|
437
|
-
self.
|
|
438
|
-
self.on_suspended(flow_run.id, flow_run.state)
|
|
595
|
+
self._notify_if_suspended_state(flow_run.id, flow_run.state)
|
|
439
596
|
|
|
440
597
|
async def __aenter__(self):
|
|
441
598
|
try:
|
|
@@ -470,6 +627,10 @@ class FlowRunSuspendingObserver:
|
|
|
470
627
|
async def __aexit__(self, *exc_info: Any):
|
|
471
628
|
self.logger.debug("Shutting down FlowRunSuspendingObserver")
|
|
472
629
|
self._is_shutting_down = True
|
|
630
|
+
tasks = [task for watch in self._watches.values() for task in watch.cancel()]
|
|
631
|
+
self._watches.clear()
|
|
632
|
+
if tasks:
|
|
633
|
+
await asyncio.gather(*tasks, return_exceptions=True)
|
|
473
634
|
await self._exit_stack.__aexit__(*exc_info)
|
|
474
635
|
if self._consumer_task is not None:
|
|
475
636
|
self._consumer_task.cancel()
|
|
@@ -424,6 +424,14 @@ class Block(BaseModel, ABC):
|
|
|
424
424
|
def ser_model(
|
|
425
425
|
self, handler: SerializerFunctionWrapHandler, info: SerializationInfo
|
|
426
426
|
) -> Any:
|
|
427
|
+
if info.context and info.context.get("serialize_blocks_as_references"):
|
|
428
|
+
if self._block_document_id is None:
|
|
429
|
+
raise BlockNotSavedError(
|
|
430
|
+
"Block must be saved with `.save()` before it can be used as a "
|
|
431
|
+
"deployment parameter."
|
|
432
|
+
)
|
|
433
|
+
return {"$ref": {"block_document_id": str(self._block_document_id)}}
|
|
434
|
+
|
|
427
435
|
jsonable_self = handler(self)
|
|
428
436
|
if (ctx := info.context) and ctx.get("include_secrets") is True:
|
|
429
437
|
# Add serialization mode to context so handle_secret_render knows how to process nested models
|
|
@@ -416,6 +416,34 @@ class FlowRunClient(BaseClient):
|
|
|
416
416
|
)
|
|
417
417
|
return result
|
|
418
418
|
|
|
419
|
+
def read_flow_run_state(self, flow_run_state_id: "UUID") -> "State":
|
|
420
|
+
"""
|
|
421
|
+
Read a flow run state by ID.
|
|
422
|
+
|
|
423
|
+
Args:
|
|
424
|
+
flow_run_state_id: The flow run state ID.
|
|
425
|
+
|
|
426
|
+
Returns:
|
|
427
|
+
A State model representation of the flow run state.
|
|
428
|
+
|
|
429
|
+
Raises:
|
|
430
|
+
ObjectNotFound: If the flow run state does not exist.
|
|
431
|
+
"""
|
|
432
|
+
try:
|
|
433
|
+
response = self.request(
|
|
434
|
+
"GET",
|
|
435
|
+
"/flow_run_states/{id}",
|
|
436
|
+
path_params={"id": flow_run_state_id},
|
|
437
|
+
)
|
|
438
|
+
except httpx.HTTPStatusError as exc:
|
|
439
|
+
if exc.response.status_code == 404:
|
|
440
|
+
raise ObjectNotFound(http_exc=exc) from exc
|
|
441
|
+
raise
|
|
442
|
+
|
|
443
|
+
from prefect.states import State
|
|
444
|
+
|
|
445
|
+
return State.model_validate(response.json())
|
|
446
|
+
|
|
419
447
|
def read_flow_run_states(self, flow_run_id: "UUID") -> "list[State]":
|
|
420
448
|
"""
|
|
421
449
|
Query for the states of a flow run
|
|
@@ -916,6 +944,34 @@ class FlowRunAsyncClient(BaseAsyncClient):
|
|
|
916
944
|
)
|
|
917
945
|
return result
|
|
918
946
|
|
|
947
|
+
async def read_flow_run_state(self, flow_run_state_id: "UUID") -> "State":
|
|
948
|
+
"""
|
|
949
|
+
Read a flow run state by ID.
|
|
950
|
+
|
|
951
|
+
Args:
|
|
952
|
+
flow_run_state_id: The flow run state ID.
|
|
953
|
+
|
|
954
|
+
Returns:
|
|
955
|
+
A State model representation of the flow run state.
|
|
956
|
+
|
|
957
|
+
Raises:
|
|
958
|
+
ObjectNotFound: If the flow run state does not exist.
|
|
959
|
+
"""
|
|
960
|
+
try:
|
|
961
|
+
response = await self.request(
|
|
962
|
+
"GET",
|
|
963
|
+
"/flow_run_states/{id}",
|
|
964
|
+
path_params={"id": flow_run_state_id},
|
|
965
|
+
)
|
|
966
|
+
except httpx.HTTPStatusError as exc:
|
|
967
|
+
if exc.response.status_code == 404:
|
|
968
|
+
raise ObjectNotFound(http_exc=exc) from exc
|
|
969
|
+
raise
|
|
970
|
+
|
|
971
|
+
from prefect.states import State
|
|
972
|
+
|
|
973
|
+
return State.model_validate(response.json())
|
|
974
|
+
|
|
919
975
|
async def read_flow_run_states(self, flow_run_id: "UUID") -> "list[State]":
|
|
920
976
|
"""
|
|
921
977
|
Query for the states of a flow run
|
{prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/filters.py
RENAMED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Schemas that define Prefect REST API filtering operations.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
from typing import List, Optional
|
|
5
|
+
from typing import ClassVar, List, Optional
|
|
6
6
|
from uuid import UUID
|
|
7
7
|
|
|
8
|
-
from pydantic import Field
|
|
8
|
+
from pydantic import ConfigDict, Field
|
|
9
9
|
|
|
10
10
|
from prefect._internal.schemas.bases import PrefectBaseModel
|
|
11
11
|
from prefect.client.schemas.objects import StateType
|
|
@@ -20,6 +20,12 @@ class Operator(AutoEnum):
|
|
|
20
20
|
or_ = AutoEnum.auto()
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
class _FlowRunFilterBaseModel(PrefectBaseModel):
|
|
24
|
+
"""Base model for flow run filters that rejects unknown fields."""
|
|
25
|
+
|
|
26
|
+
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
|
|
27
|
+
|
|
28
|
+
|
|
23
29
|
class OperatorMixin:
|
|
24
30
|
"""Base model for Prefect filters that combines criteria with a user-provided operator"""
|
|
25
31
|
|
|
@@ -87,7 +93,7 @@ class FlowFilter(PrefectBaseModel, OperatorMixin):
|
|
|
87
93
|
)
|
|
88
94
|
|
|
89
95
|
|
|
90
|
-
class FlowRunFilterId(
|
|
96
|
+
class FlowRunFilterId(_FlowRunFilterBaseModel):
|
|
91
97
|
"""Filter by FlowRun.id."""
|
|
92
98
|
|
|
93
99
|
any_: Optional[List[UUID]] = Field(
|
|
@@ -98,7 +104,7 @@ class FlowRunFilterId(PrefectBaseModel):
|
|
|
98
104
|
)
|
|
99
105
|
|
|
100
106
|
|
|
101
|
-
class FlowRunFilterName(
|
|
107
|
+
class FlowRunFilterName(_FlowRunFilterBaseModel):
|
|
102
108
|
"""Filter by `FlowRun.name`."""
|
|
103
109
|
|
|
104
110
|
any_: Optional[List[str]] = Field(
|
|
@@ -118,7 +124,7 @@ class FlowRunFilterName(PrefectBaseModel):
|
|
|
118
124
|
)
|
|
119
125
|
|
|
120
126
|
|
|
121
|
-
class FlowRunFilterTags(
|
|
127
|
+
class FlowRunFilterTags(_FlowRunFilterBaseModel, OperatorMixin):
|
|
122
128
|
"""Filter by `FlowRun.tags`."""
|
|
123
129
|
|
|
124
130
|
all_: Optional[List[str]] = Field(
|
|
@@ -139,7 +145,7 @@ class FlowRunFilterTags(PrefectBaseModel, OperatorMixin):
|
|
|
139
145
|
)
|
|
140
146
|
|
|
141
147
|
|
|
142
|
-
class FlowRunFilterDeploymentId(
|
|
148
|
+
class FlowRunFilterDeploymentId(_FlowRunFilterBaseModel, OperatorMixin):
|
|
143
149
|
"""Filter by `FlowRun.deployment_id`."""
|
|
144
150
|
|
|
145
151
|
any_: Optional[List[UUID]] = Field(
|
|
@@ -151,7 +157,7 @@ class FlowRunFilterDeploymentId(PrefectBaseModel, OperatorMixin):
|
|
|
151
157
|
)
|
|
152
158
|
|
|
153
159
|
|
|
154
|
-
class FlowRunFilterWorkQueueName(
|
|
160
|
+
class FlowRunFilterWorkQueueName(_FlowRunFilterBaseModel, OperatorMixin):
|
|
155
161
|
"""Filter by `FlowRun.work_queue_name`."""
|
|
156
162
|
|
|
157
163
|
any_: Optional[List[str]] = Field(
|
|
@@ -165,7 +171,7 @@ class FlowRunFilterWorkQueueName(PrefectBaseModel, OperatorMixin):
|
|
|
165
171
|
)
|
|
166
172
|
|
|
167
173
|
|
|
168
|
-
class FlowRunFilterStateType(
|
|
174
|
+
class FlowRunFilterStateType(_FlowRunFilterBaseModel):
|
|
169
175
|
"""Filter by `FlowRun.state_type`."""
|
|
170
176
|
|
|
171
177
|
any_: Optional[List[StateType]] = Field(
|
|
@@ -176,7 +182,7 @@ class FlowRunFilterStateType(PrefectBaseModel):
|
|
|
176
182
|
)
|
|
177
183
|
|
|
178
184
|
|
|
179
|
-
class FlowRunFilterStateName(
|
|
185
|
+
class FlowRunFilterStateName(_FlowRunFilterBaseModel):
|
|
180
186
|
any_: Optional[List[str]] = Field(
|
|
181
187
|
default=None, description="A list of flow run state names to include"
|
|
182
188
|
)
|
|
@@ -185,7 +191,7 @@ class FlowRunFilterStateName(PrefectBaseModel):
|
|
|
185
191
|
)
|
|
186
192
|
|
|
187
193
|
|
|
188
|
-
class FlowRunFilterState(
|
|
194
|
+
class FlowRunFilterState(_FlowRunFilterBaseModel, OperatorMixin):
|
|
189
195
|
type: Optional[FlowRunFilterStateType] = Field(
|
|
190
196
|
default=None, description="Filter criteria for `FlowRun` state type"
|
|
191
197
|
)
|
|
@@ -194,7 +200,7 @@ class FlowRunFilterState(PrefectBaseModel, OperatorMixin):
|
|
|
194
200
|
)
|
|
195
201
|
|
|
196
202
|
|
|
197
|
-
class FlowRunFilterFlowVersion(
|
|
203
|
+
class FlowRunFilterFlowVersion(_FlowRunFilterBaseModel):
|
|
198
204
|
"""Filter by `FlowRun.flow_version`."""
|
|
199
205
|
|
|
200
206
|
any_: Optional[List[str]] = Field(
|
|
@@ -202,7 +208,7 @@ class FlowRunFilterFlowVersion(PrefectBaseModel):
|
|
|
202
208
|
)
|
|
203
209
|
|
|
204
210
|
|
|
205
|
-
class FlowRunFilterStartTime(
|
|
211
|
+
class FlowRunFilterStartTime(_FlowRunFilterBaseModel):
|
|
206
212
|
"""Filter by `FlowRun.start_time`."""
|
|
207
213
|
|
|
208
214
|
before_: Optional[DateTime] = Field(
|
|
@@ -218,7 +224,7 @@ class FlowRunFilterStartTime(PrefectBaseModel):
|
|
|
218
224
|
)
|
|
219
225
|
|
|
220
226
|
|
|
221
|
-
class FlowRunFilterEndTime(
|
|
227
|
+
class FlowRunFilterEndTime(_FlowRunFilterBaseModel):
|
|
222
228
|
"""Filter by `FlowRun.end_time`."""
|
|
223
229
|
|
|
224
230
|
before_: Optional[DateTime] = Field(
|
|
@@ -234,7 +240,7 @@ class FlowRunFilterEndTime(PrefectBaseModel):
|
|
|
234
240
|
)
|
|
235
241
|
|
|
236
242
|
|
|
237
|
-
class FlowRunFilterExpectedStartTime(
|
|
243
|
+
class FlowRunFilterExpectedStartTime(_FlowRunFilterBaseModel):
|
|
238
244
|
"""Filter by `FlowRun.expected_start_time`."""
|
|
239
245
|
|
|
240
246
|
before_: Optional[DateTime] = Field(
|
|
@@ -247,7 +253,7 @@ class FlowRunFilterExpectedStartTime(PrefectBaseModel):
|
|
|
247
253
|
)
|
|
248
254
|
|
|
249
255
|
|
|
250
|
-
class FlowRunFilterNextScheduledStartTime(
|
|
256
|
+
class FlowRunFilterNextScheduledStartTime(_FlowRunFilterBaseModel):
|
|
251
257
|
"""Filter by `FlowRun.next_scheduled_start_time`."""
|
|
252
258
|
|
|
253
259
|
before_: Optional[DateTime] = Field(
|
|
@@ -266,7 +272,7 @@ class FlowRunFilterNextScheduledStartTime(PrefectBaseModel):
|
|
|
266
272
|
)
|
|
267
273
|
|
|
268
274
|
|
|
269
|
-
class FlowRunFilterParentFlowRunId(
|
|
275
|
+
class FlowRunFilterParentFlowRunId(_FlowRunFilterBaseModel, OperatorMixin):
|
|
270
276
|
"""Filter for subflows of the given flow runs"""
|
|
271
277
|
|
|
272
278
|
any_: Optional[List[UUID]] = Field(
|
|
@@ -274,7 +280,7 @@ class FlowRunFilterParentFlowRunId(PrefectBaseModel, OperatorMixin):
|
|
|
274
280
|
)
|
|
275
281
|
|
|
276
282
|
|
|
277
|
-
class FlowRunFilterParentTaskRunId(
|
|
283
|
+
class FlowRunFilterParentTaskRunId(_FlowRunFilterBaseModel, OperatorMixin):
|
|
278
284
|
"""Filter by `FlowRun.parent_task_run_id`."""
|
|
279
285
|
|
|
280
286
|
any_: Optional[List[UUID]] = Field(
|
|
@@ -286,7 +292,7 @@ class FlowRunFilterParentTaskRunId(PrefectBaseModel, OperatorMixin):
|
|
|
286
292
|
)
|
|
287
293
|
|
|
288
294
|
|
|
289
|
-
class FlowRunFilterIdempotencyKey(
|
|
295
|
+
class FlowRunFilterIdempotencyKey(_FlowRunFilterBaseModel):
|
|
290
296
|
"""Filter by FlowRun.idempotency_key."""
|
|
291
297
|
|
|
292
298
|
any_: Optional[List[str]] = Field(
|
|
@@ -297,7 +303,7 @@ class FlowRunFilterIdempotencyKey(PrefectBaseModel):
|
|
|
297
303
|
)
|
|
298
304
|
|
|
299
305
|
|
|
300
|
-
class FlowRunFilterCreatedBy(
|
|
306
|
+
class FlowRunFilterCreatedBy(_FlowRunFilterBaseModel, OperatorMixin):
|
|
301
307
|
"""Filter by `FlowRun.created_by`."""
|
|
302
308
|
|
|
303
309
|
id_: Optional[List[UUID]] = Field(
|
|
@@ -318,7 +324,7 @@ class FlowRunFilterCreatedBy(PrefectBaseModel, OperatorMixin):
|
|
|
318
324
|
)
|
|
319
325
|
|
|
320
326
|
|
|
321
|
-
class FlowRunFilter(
|
|
327
|
+
class FlowRunFilter(_FlowRunFilterBaseModel, OperatorMixin):
|
|
322
328
|
"""Filter flow runs. Only flow runs matching all criteria will be returned"""
|
|
323
329
|
|
|
324
330
|
id: Optional[FlowRunFilterId] = Field(
|
|
@@ -40,5 +40,5 @@ Layered — public → internal → services, with leases and events as cross-cu
|
|
|
40
40
|
|
|
41
41
|
- **Service singleton is keyed on `frozenset(names)`.** Passing the same names in different order reuses the same singleton; passing a strict subset creates a different singleton. Each unique name-set gets its own queue.
|
|
42
42
|
- **Lease renewal runs on a daemon thread.** The thread copies the caller's context variables for settings and logging context, then uses the standard `get_client(sync_client=True)` path instead of lease-specific async-client cloning. Sync callers join the thread briefly on exit; async callers only signal the thread to stop so the event loop is not blocked.
|
|
43
|
-
- **
|
|
43
|
+
- **Cleanup leases are recorded at acquisition, not reactively on cancellation.** `ConcurrencyContext.cleanup_lease_ids` gets the lease ID the moment a lease is granted, and it's discarded again after a successful release. This closes a race where cancellation fires the instant the lease is granted — before the release call is even reached — which would otherwise leak the slot. `ConcurrencyContext.__exit__` releases any leases still in the list via a sync client; if `ConcurrencyContext` is not active, those leases are abandoned until server-side expiry.
|
|
44
44
|
- **`v1/` subdirectory** contains the legacy slot API (no lease model). New code should use the top-level `concurrency()` / `rate_limit()` APIs.
|