This is an automated email from the ASF dual-hosted git repository.
ashb pushed a change to branch single-pass-spelling
in repository https://gitbox.apache.org/repos/asf/airflow.git
omit 733b47b6888 Halve the time to build docs locally by inlining spell
checking
add bb721616ad0 Fix AWS auth manager login when the IdP is on another site
(#74529)
add 65a83820fef Let SandboxToolset be deep-copied again (#74525)
add 7675d8d2f39 Add missing UI translations for Greek(el) (#74460)
add 6255513a3b6 Add missing Polish UI translations (#74533)
add 9bf8cc0a6fb Add Snowflake Cortex Agent management operators (#70930)
add 0bae39f4884 Document that `SQLToolset` does not check functions
without `allowed_tables` (#74444)
add 1a6ea8899c3 UI: Group digits of counters in translated strings (#74296)
add 051d5d85d2f TS SDK: Add human-in-the-loop tasks to native Dags (#74484)
add 0c3853692bc Add user-facing docs for the new Task Loops feature.
(#74274)
add 78572f6efc7 Introduce the (internal/db level) concept of "dynamic
regions" for TIs (#74275)
add 2f7d9662623 Resolve live producers by region and read their XCom by
attempt (#74344)
add 9bc8cad3f84 Pin loop definitions and carry region coordinates through
task execution (#74345)
add 93f857f40da Give every mapped expansion a region and store its index
as region_index (#74346)
add 6b20a69691e Attribute log, asset-event and asset-state writes to the
task attempt (#74347)
add 551d54bdaee Run loop gates and advance iterations atomically (#74348)
add ea4519b9f56 Clear selected loop work and regenerate only what was
replaced (#74349)
add 0226554076f Read current task executions by exact region and try
(#74350)
add feafb6c5ee1 Let the HITL review plugin address one loop pass or mapped
slot (#74351)
add d0f83bb4a3a Show current task executions in the UI (#74352)
add fe589528ee4 Show loop iterations and outcomes throughout the UI
(#74354)
add ed572aff106 Bound LLM operator usage_limits across task retries
(#74396)
add 12bb6d9b953 Cover native TypeScript and Java Dags, including control
flow, in the e2e suites (#73847)
add 7749ecdb977 Bump eslint-plugin-unicorn (#74508)
add 4ca1f6693bb Deprecate cyclic TaskGroup dependencies (#73746)
add 72ac4fb4f1c Stop loading the task runner on every Airflow process
startup (#74496)
add 78d31882a08 Test that deferred capability ids stay out of Common AI
durable fingerprints (#74423)
add 06e7e284e32 Log capability tool calls in AgentOperator (#72202)
add 3ac1e4f7f2e Make asset event batching opt-in (#68517)
add 92340cf4171 i18n(ko): Add missing translations (Oct 1) (#74006)
add c96984baf44 Add sqlglot drift tripwires for common.ai read-only SQL
validation (#74487)
add 1530df852ba Rename `HookToolset` `tool_name_prefix` to `tool_prefix`
(#74447)
add d05147d56cb Halve the time to build docs locally by inlining spell
checking
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (733b47b6888)
\
N -- N -- N refs/heads/single-pass-spelling (d05147d56cb)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
No new revisions were added by this update.
Summary of changes:
.agents/skills/airflow-translations/SKILL.md | 4 +
.agents/skills/airflow-translations/locales/ar.md | 10 +-
.agents/skills/airflow-translations/locales/ca.md | 2 +-
.agents/skills/airflow-translations/locales/de.md | 2 +-
.agents/skills/airflow-translations/locales/el.md | 2 +-
.agents/skills/airflow-translations/locales/es.md | 2 +-
.agents/skills/airflow-translations/locales/fr.md | 2 +-
.agents/skills/airflow-translations/locales/he.md | 4 +-
.agents/skills/airflow-translations/locales/hu.md | 4 +-
.agents/skills/airflow-translations/locales/ja.md | 2 +-
.agents/skills/airflow-translations/locales/ko.md | 26 +-
.agents/skills/airflow-translations/locales/nl.md | 2 +-
.agents/skills/airflow-translations/locales/pl.md | 6 +-
.agents/skills/airflow-translations/locales/pt.md | 2 +-
.agents/skills/airflow-translations/locales/tr.md | 2 +-
.../skills/airflow-translations/locales/zh-CN.md | 12 +-
.../skills/airflow-translations/locales/zh-TW.md | 8 +-
.github/workflows/k8s-tests.yml | 36 +-
.rat-excludes | 1 +
.../dag-serialization.rst | 2 +-
.../task-and-asset-state-store.rst | 4 +-
.../authoring-and-scheduling/asset-scheduling.rst | 64 +
.../docs/authoring-and-scheduling/deferring.rst | 2 +-
.../dynamic-task-mapping.rst | 18 +-
.../docs/authoring-and-scheduling/index.rst | 2 +
.../loops-and-mapped-tasks.rst | 61 +
.../docs/authoring-and-scheduling/loops.rst | 392 +++++
airflow-core/docs/core-concepts/dags.rst | 72 +
.../core-concepts/task-and-asset-state-store.rst | 2 +-
.../docs/core-concepts/task-state-store.rst | 4 +-
airflow-core/docs/core-concepts/tasks.rst | 2 +-
airflow-core/docs/migrations-ref.rst | 11 +-
airflow-core/newsfragments/68517.significant.rst | 14 +
airflow-core/newsfragments/73746.significant.rst | 22 +
airflow-core/newsfragments/task-loops.feature.rst | 1 +
.../auth/managers/simple/ui/package.json | 2 +-
.../auth/managers/simple/ui/pnpm-lock.yaml | 70 +-
.../airflow/api_fastapi/common/parameters/misc.py | 3 +-
.../airflow/api_fastapi/common/parameters/sort.py | 6 +-
.../api_fastapi/common/parameters/task_instance.py | 7 +-
.../src/airflow/api_fastapi/common/region.py | 54 +
.../core_api/datamodels/asset_state_store.py | 8 +-
.../api_fastapi/core_api/datamodels/assets.py | 2 +
.../api_fastapi/core_api/datamodels/event_logs.py | 2 +
.../core_api/datamodels/task_instance_history.py | 10 +-
.../core_api/datamodels/task_instances.py | 42 +-
.../api_fastapi/core_api/datamodels/ui/common.py | 4 +
.../datamodels/ui/{gantt.py => execution.py} | 44 +-
.../api_fastapi/core_api/datamodels/ui/gantt.py | 10 +-
.../api_fastapi/core_api/datamodels/ui/grid.py | 58 +
.../core_api/datamodels/ui/structure.py | 4 +
.../api_fastapi/core_api/datamodels/xcom.py | 10 +-
.../api_fastapi/core_api/openapi/_private_ui.yaml | 661 +++++++++
.../core_api/openapi/v2-rest-api-generated.yaml | 1151 ++++++++++++++-
.../core_api/routes/public/asset_state_store.py | 16 +
.../api_fastapi/core_api/routes/public/assets.py | 6 +
.../api_fastapi/core_api/routes/public/dag_run.py | 7 +-
.../core_api/routes/public/event_logs.py | 33 +-
.../core_api/routes/public/extra_links.py | 39 +-
.../api_fastapi/core_api/routes/public/hitl.py | 98 +-
.../api_fastapi/core_api/routes/public/log.py | 27 +-
.../core_api/routes/public/task_instances.py | 537 +++++--
.../core_api/routes/public/task_state_store.py | 105 +-
.../api_fastapi/core_api/routes/public/xcom.py | 119 +-
.../api_fastapi/core_api/routes/ui/__init__.py | 2 +
.../airflow/api_fastapi/core_api/routes/ui/dags.py | 12 +-
.../api_fastapi/core_api/routes/ui/execution.py | 112 ++
.../api_fastapi/core_api/routes/ui/gantt.py | 28 +-
.../airflow/api_fastapi/core_api/routes/ui/grid.py | 123 +-
.../core_api/routes/ui/partitioned_dag_runs.py | 11 +-
.../core_api/services/public/dag_run.py | 119 +-
.../core_api/services/public/event_logs.py | 10 +-
.../core_api/services/public/task_coordinates.py | 249 ++++
.../core_api/services/public/task_instances.py | 398 ++++-
.../api_fastapi/core_api/services/ui/execution.py | 74 +
.../api_fastapi/core_api/services/ui/grid.py | 278 +++-
.../api_fastapi/core_api/services/ui/task_group.py | 15 +
.../src/airflow/api_fastapi/execution_api/app.py | 12 +-
.../execution_api/datamodels/taskinstance.py | 39 +-
.../execution_api/routes/asset_state_store.py | 40 +-
.../execution_api/routes/task_instances.py | 496 +++++--
.../execution_api/routes/task_state_store.py | 8 +-
.../api_fastapi/execution_api/routes/xcoms.py | 359 ++++-
.../api_fastapi/execution_api/versions/__init__.py | 8 +
.../execution_api/versions/v2026_10_30.py | 25 +
.../versions/v2026_10_30_xcom_params.py} | 33 +-
.../src/airflow/api_fastapi/logging/decorators.py | 39 +
airflow-core/src/airflow/assets/manager.py | 33 +-
.../src/airflow/cli/commands/dag_command.py | 9 +-
.../airflow/cli/commands/state_store_command.py | 6 +-
.../src/airflow/cli/commands/task_command.py | 103 +-
.../src/airflow/config_templates/config.yml | 15 +
.../src/airflow/dag_processing/collection.py | 1 +
airflow-core/src/airflow/dag_processing/dagbag.py | 31 +-
.../src/airflow/dag_processing/processor.py | 3 +
.../src/airflow/example_dags/example_task_loops.py | 114 ++
.../src/airflow/executors/base_executor.py | 5 +-
.../src/airflow/executors/workloads/task.py | 23 +-
.../src/airflow/jobs/scheduler_job_runner.py | 289 +++-
.../src/airflow/jobs/triggerer_job_runner.py | 37 +-
airflow-core/src/airflow/migrations/utils.py | 72 +
.../0142_3_4_0_unify_task_attempt_ownership.py | 26 +-
.../0143_3_4_0_add_dynamic_region_storage.py | 211 +++
.../versions/0144_3_4_0_rename_stored_map_index.py | 76 +
.../0145_3_4_0_add_task_identity_to_events.py | 49 +
.../0146_3_4_0_add_asset_state_writer_identity.py | 55 +
airflow-core/src/airflow/models/__init__.py | 1 +
airflow-core/src/airflow/models/asset.py | 21 +-
.../src/airflow/models/asset_state_store.py | 9 +-
airflow-core/src/airflow/models/dagrun.py | 627 ++++++--
airflow-core/src/airflow/models/dagwarning.py | 1 +
airflow-core/src/airflow/models/dynamic_region.py | 885 +++++++++++
airflow-core/src/airflow/models/expandinput.py | 31 +-
airflow-core/src/airflow/models/log.py | 71 +-
.../src/airflow/models/renderedtifields.py | 2 +-
airflow-core/src/airflow/models/serialized_dag.py | 4 +-
.../src/airflow/models/task_coordinates.py | 838 +++++++++++
.../src/airflow/models/task_state_store.py | 20 +-
airflow-core/src/airflow/models/taskinstance.py | 773 +++++++++-
airflow-core/src/airflow/models/trigger.py | 17 +-
airflow-core/src/airflow/models/xcom.py | 71 +-
.../src/airflow/serialization/dag_version_diff.py | 2 +
.../airflow/serialization/definitions/assets.py | 13 +
.../serialization/definitions/baseoperator.py | 6 +-
.../src/airflow/serialization/definitions/dag.py | 154 +-
.../serialization/definitions/mappedoperator.py | 55 +-
.../serialization/definitions/operatorlink.py | 8 +-
.../airflow/serialization/definitions/taskgroup.py | 10 +
.../airflow/serialization/definitions/xcom_arg.py | 111 +-
airflow-core/src/airflow/serialization/encoders.py | 7 +-
airflow-core/src/airflow/serialization/schema.json | 12 +
.../airflow/serialization/serialized_objects.py | 22 +-
airflow-core/src/airflow/state/metastore.py | 94 +-
airflow-core/src/airflow/ti_deps/dep_context.py | 71 +-
.../airflow/ti_deps/deps/mapped_task_expanded.py | 2 +-
.../ti_deps/deps/mapped_task_upstream_dep.py | 37 +-
.../ti_deps/deps/not_previously_skipped_dep.py | 8 +-
.../airflow/ti_deps/deps/ready_to_reschedule.py | 9 +-
.../src/airflow/ti_deps/deps/trigger_rule_dep.py | 98 +-
airflow-core/src/airflow/timetables/assets.py | 35 +-
airflow-core/src/airflow/timetables/base.py | 16 +
airflow-core/src/airflow/timetables/simple.py | 91 +-
.../src/airflow/ui/openapi-gen/queries/common.ts | 175 ++-
.../ui/openapi-gen/queries/ensureQueryData.ts | 263 +++-
.../src/airflow/ui/openapi-gen/queries/prefetch.ts | 263 +++-
.../src/airflow/ui/openapi-gen/queries/queries.ts | 369 ++++-
.../src/airflow/ui/openapi-gen/queries/suspense.ts | 263 +++-
.../airflow/ui/openapi-gen/requests/schemas.gen.ts | 1207 +++++++++++++--
.../ui/openapi-gen/requests/services.gen.ts | 370 ++++-
.../airflow/ui/openapi-gen/requests/types.gen.ts | 529 ++++++-
.../airflow/ui/public/i18n/locales/ar/admin.json | 12 +-
.../airflow/ui/public/i18n/locales/ar/common.json | 14 +-
.../ui/public/i18n/locales/ar/components.json | 56 +-
.../src/airflow/ui/public/i18n/locales/ar/dag.json | 30 +-
.../airflow/ui/public/i18n/locales/ar/dags.json | 4 +-
.../ui/public/i18n/locales/ar/dashboard.json | 18 +-
.../airflow/ui/public/i18n/locales/ar/hitl.json | 12 +-
.../airflow/ui/public/i18n/locales/ca/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/ca/browse.json | 2 +-
.../airflow/ui/public/i18n/locales/ca/common.json | 16 +-
.../ui/public/i18n/locales/ca/components.json | 40 +-
.../src/airflow/ui/public/i18n/locales/ca/dag.json | 24 +-
.../airflow/ui/public/i18n/locales/ca/dags.json | 4 +-
.../ui/public/i18n/locales/ca/dashboard.json | 14 +-
.../airflow/ui/public/i18n/locales/ca/hitl.json | 8 +-
.../airflow/ui/public/i18n/locales/de/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/de/browse.json | 4 +-
.../airflow/ui/public/i18n/locales/de/common.json | 16 +-
.../ui/public/i18n/locales/de/components.json | 40 +-
.../src/airflow/ui/public/i18n/locales/de/dag.json | 24 +-
.../airflow/ui/public/i18n/locales/de/dags.json | 4 +-
.../ui/public/i18n/locales/de/dashboard.json | 12 +-
.../airflow/ui/public/i18n/locales/de/hitl.json | 8 +-
.../airflow/ui/public/i18n/locales/el/admin.json | 19 +-
.../airflow/ui/public/i18n/locales/el/assets.json | 16 +-
.../airflow/ui/public/i18n/locales/el/browse.json | 32 +
.../airflow/ui/public/i18n/locales/el/common.json | 143 +-
.../ui/public/i18n/locales/el/components.json | 70 +-
.../src/airflow/ui/public/i18n/locales/el/dag.json | 101 +-
.../airflow/ui/public/i18n/locales/el/dags.json | 49 +-
.../ui/public/i18n/locales/el/dashboard.json | 27 +-
.../airflow/ui/public/i18n/locales/el/hitl.json | 8 +-
.../airflow/ui/public/i18n/locales/en/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/en/browse.json | 2 +-
.../airflow/ui/public/i18n/locales/en/common.json | 18 +-
.../ui/public/i18n/locales/en/components.json | 30 +-
.../src/airflow/ui/public/i18n/locales/en/dag.json | 71 +-
.../airflow/ui/public/i18n/locales/en/dags.json | 8 +-
.../ui/public/i18n/locales/en/dashboard.json | 14 +-
.../airflow/ui/public/i18n/locales/en/hitl.json | 8 +-
.../airflow/ui/public/i18n/locales/es/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/es/common.json | 16 +-
.../ui/public/i18n/locales/es/components.json | 28 +-
.../src/airflow/ui/public/i18n/locales/es/dag.json | 20 +-
.../airflow/ui/public/i18n/locales/es/dags.json | 4 +-
.../ui/public/i18n/locales/es/dashboard.json | 10 +-
.../airflow/ui/public/i18n/locales/es/hitl.json | 8 +-
.../airflow/ui/public/i18n/locales/fr/admin.json | 8 +-
.../airflow/ui/public/i18n/locales/fr/browse.json | 6 +-
.../airflow/ui/public/i18n/locales/fr/common.json | 20 +-
.../ui/public/i18n/locales/fr/components.json | 60 +-
.../src/airflow/ui/public/i18n/locales/fr/dag.json | 34 +-
.../airflow/ui/public/i18n/locales/fr/dags.json | 4 +-
.../ui/public/i18n/locales/fr/dashboard.json | 20 +-
.../airflow/ui/public/i18n/locales/fr/hitl.json | 10 +-
.../airflow/ui/public/i18n/locales/he/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/he/common.json | 14 +-
.../ui/public/i18n/locales/he/components.json | 22 +-
.../src/airflow/ui/public/i18n/locales/he/dag.json | 22 +-
.../airflow/ui/public/i18n/locales/he/dags.json | 4 +-
.../ui/public/i18n/locales/he/dashboard.json | 10 +-
.../airflow/ui/public/i18n/locales/he/hitl.json | 10 +-
.../airflow/ui/public/i18n/locales/hi/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/hi/common.json | 12 +-
.../ui/public/i18n/locales/hi/components.json | 26 +-
.../src/airflow/ui/public/i18n/locales/hi/dag.json | 20 +-
.../airflow/ui/public/i18n/locales/hi/dags.json | 4 +-
.../ui/public/i18n/locales/hi/dashboard.json | 10 +-
.../airflow/ui/public/i18n/locales/hi/hitl.json | 8 +-
.../airflow/ui/public/i18n/locales/hu/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/hu/common.json | 12 +-
.../ui/public/i18n/locales/hu/components.json | 28 +-
.../src/airflow/ui/public/i18n/locales/hu/dag.json | 20 +-
.../airflow/ui/public/i18n/locales/hu/dags.json | 4 +-
.../ui/public/i18n/locales/hu/dashboard.json | 6 +-
.../airflow/ui/public/i18n/locales/hu/hitl.json | 4 +-
.../airflow/ui/public/i18n/locales/it/admin.json | 8 +-
.../airflow/ui/public/i18n/locales/it/common.json | 4 +-
.../ui/public/i18n/locales/it/components.json | 44 +-
.../src/airflow/ui/public/i18n/locales/it/dag.json | 6 +-
.../airflow/ui/public/i18n/locales/it/dags.json | 4 +-
.../ui/public/i18n/locales/it/dashboard.json | 6 +-
.../airflow/ui/public/i18n/locales/it/hitl.json | 6 +-
.../airflow/ui/public/i18n/locales/ja/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/ja/common.json | 4 +-
.../ui/public/i18n/locales/ja/components.json | 24 +-
.../src/airflow/ui/public/i18n/locales/ja/dag.json | 4 +-
.../airflow/ui/public/i18n/locales/ja/dags.json | 4 +-
.../ui/public/i18n/locales/ja/dashboard.json | 4 +-
.../airflow/ui/public/i18n/locales/ja/hitl.json | 4 +-
.../airflow/ui/public/i18n/locales/ko/admin.json | 5 +-
.../airflow/ui/public/i18n/locales/ko/assets.json | 1 +
.../airflow/ui/public/i18n/locales/ko/browse.json | 2 +-
.../airflow/ui/public/i18n/locales/ko/common.json | 58 +-
.../ui/public/i18n/locales/ko/components.json | 44 +-
.../src/airflow/ui/public/i18n/locales/ko/dag.json | 135 +-
.../airflow/ui/public/i18n/locales/ko/dags.json | 35 +-
.../ui/public/i18n/locales/ko/dashboard.json | 14 +-
.../airflow/ui/public/i18n/locales/ko/hitl.json | 8 +-
.../airflow/ui/public/i18n/locales/nl/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/nl/common.json | 12 +-
.../ui/public/i18n/locales/nl/components.json | 26 +-
.../src/airflow/ui/public/i18n/locales/nl/dag.json | 20 +-
.../airflow/ui/public/i18n/locales/nl/dags.json | 4 +-
.../ui/public/i18n/locales/nl/dashboard.json | 6 +-
.../airflow/ui/public/i18n/locales/nl/hitl.json | 8 +-
.../airflow/ui/public/i18n/locales/pl/admin.json | 13 +-
.../airflow/ui/public/i18n/locales/pl/assets.json | 1 +
.../airflow/ui/public/i18n/locales/pl/browse.json | 6 +-
.../airflow/ui/public/i18n/locales/pl/common.json | 68 +-
.../ui/public/i18n/locales/pl/components.json | 91 +-
.../src/airflow/ui/public/i18n/locales/pl/dag.json | 108 +-
.../airflow/ui/public/i18n/locales/pl/dags.json | 25 +-
.../ui/public/i18n/locales/pl/dashboard.json | 35 +-
.../airflow/ui/public/i18n/locales/pl/hitl.json | 12 +-
.../airflow/ui/public/i18n/locales/pt/admin.json | 8 +-
.../airflow/ui/public/i18n/locales/pt/common.json | 10 +-
.../ui/public/i18n/locales/pt/components.json | 44 +-
.../src/airflow/ui/public/i18n/locales/pt/dag.json | 6 +-
.../airflow/ui/public/i18n/locales/pt/dags.json | 4 +-
.../ui/public/i18n/locales/pt/dashboard.json | 6 +-
.../airflow/ui/public/i18n/locales/pt/hitl.json | 6 +-
.../airflow/ui/public/i18n/locales/ru/admin.json | 12 +-
.../airflow/ui/public/i18n/locales/ru/common.json | 16 +-
.../ui/public/i18n/locales/ru/components.json | 58 +-
.../src/airflow/ui/public/i18n/locales/ru/dag.json | 36 +-
.../airflow/ui/public/i18n/locales/ru/dags.json | 4 +-
.../ui/public/i18n/locales/ru/dashboard.json | 18 +-
.../airflow/ui/public/i18n/locales/ru/hitl.json | 12 +-
.../airflow/ui/public/i18n/locales/th/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/th/common.json | 4 +-
.../ui/public/i18n/locales/th/components.json | 16 +-
.../src/airflow/ui/public/i18n/locales/th/dag.json | 4 +-
.../airflow/ui/public/i18n/locales/th/dags.json | 4 +-
.../ui/public/i18n/locales/th/dashboard.json | 4 +-
.../airflow/ui/public/i18n/locales/th/hitl.json | 4 +-
.../airflow/ui/public/i18n/locales/tr/admin.json | 4 +-
.../airflow/ui/public/i18n/locales/tr/common.json | 12 +-
.../ui/public/i18n/locales/tr/components.json | 26 +-
.../src/airflow/ui/public/i18n/locales/tr/dag.json | 20 +-
.../airflow/ui/public/i18n/locales/tr/dags.json | 4 +-
.../ui/public/i18n/locales/tr/dashboard.json | 6 +-
.../airflow/ui/public/i18n/locales/tr/hitl.json | 4 +-
.../ui/public/i18n/locales/zh-CN/admin.json | 4 +-
.../ui/public/i18n/locales/zh-CN/common.json | 12 +-
.../ui/public/i18n/locales/zh-CN/components.json | 26 +-
.../airflow/ui/public/i18n/locales/zh-CN/dag.json | 14 +-
.../airflow/ui/public/i18n/locales/zh-CN/dags.json | 4 +-
.../ui/public/i18n/locales/zh-CN/dashboard.json | 6 +-
.../airflow/ui/public/i18n/locales/zh-CN/hitl.json | 8 +-
.../ui/public/i18n/locales/zh-TW/admin.json | 4 +-
.../ui/public/i18n/locales/zh-TW/browse.json | 2 +-
.../ui/public/i18n/locales/zh-TW/common.json | 16 +-
.../ui/public/i18n/locales/zh-TW/components.json | 30 +-
.../airflow/ui/public/i18n/locales/zh-TW/dag.json | 22 +-
.../airflow/ui/public/i18n/locales/zh-TW/dags.json | 4 +-
.../ui/public/i18n/locales/zh-TW/dashboard.json | 12 +-
.../airflow/ui/public/i18n/locales/zh-TW/hitl.json | 8 +-
.../components/ActionAccordion/ActionAccordion.tsx | 6 +-
.../ui/src/components/ActionAccordion/columns.tsx | 16 +-
.../ui/src/components/AssetProgressCell.test.tsx | 70 +
.../ui/src/components/AssetProgressCell.tsx | 15 +-
.../TaskInstance/ClearGroupTaskInstanceDialog.tsx | 1 -
.../ClearTaskInstanceConfirmationDialog.tsx | 33 +-
.../TaskInstance/ClearTaskInstanceDialog.test.tsx | 357 ++++-
.../Clear/TaskInstance/ClearTaskInstanceDialog.tsx | 383 +++--
.../ui/src/components/DurationChart.test.tsx | 36 +-
.../airflow/ui/src/components/DurationChart.tsx | 10 +-
.../ui/src/components/Graph/TaskLink.test.tsx | 6 +-
.../airflow/ui/src/components/Graph/TaskLink.tsx | 11 +-
.../airflow/ui/src/components/Graph/TaskNode.tsx | 4 +
.../ui/src/components/Graph/elkGraphUtils.ts | 6 +
.../ui/src/components/Graph/reactflowUtils.ts | 2 +
.../TaskInstance/MarkTaskInstanceAsDialog.test.tsx | 61 +-
.../TaskInstance/MarkTaskInstanceAsDialog.tsx | 14 +-
.../ui/src/components/TaskInstanceTooltip.test.tsx | 1 +
.../ui/src/components/TaskInstanceTooltip.tsx | 31 +-
.../src/airflow/ui/src/components/TaskName.tsx | 17 +-
.../ui/src/components/TaskTrySelect.test.tsx | 18 +-
.../airflow/ui/src/components/TaskTrySelect.tsx | 31 +-
.../src/airflow/ui/src/constants/searchParams.ts | 5 +
.../ui/src/hooks/useHITLReviewTabs.test.tsx | 58 +
.../src/airflow/ui/src/hooks/useHITLReviewTabs.ts | 26 +-
.../src/airflow/ui/src/hooks/useLoopRuleStats.tsx | 61 +
.../ui/src/hooks/usePluginAppliesToContext.test.ts | 36 +-
.../ui/src/hooks/usePluginAppliesToContext.ts | 4 +-
.../airflow/ui/src/hooks/useRequiredActionTabs.ts | 55 +-
.../ui/src/hooks/useSelectedVersion.test.tsx | 73 +
.../src/airflow/ui/src/hooks/useSelectedVersion.ts | 3 +
.../ui/src/hooks/useTaskInstanceCoordinates.ts | 17 +-
.../ui/src/hooks/useTaskInstanceView.test.ts | 97 ++
.../airflow/ui/src/hooks/useTaskInstanceView.ts | 68 +
airflow-core/src/airflow/ui/src/i18n/config.ts | 10 +
.../src/airflow/ui/src/i18n/locales.test.ts | 101 ++
.../ui/src/layouts/Details/DagBreadcrumb.test.tsx | 20 +-
.../ui/src/layouts/Details/DagBreadcrumb.tsx | 6 +-
.../airflow/ui/src/layouts/Details/Gantt/Gantt.tsx | 1 -
.../layouts/Details/Gantt/GanttTimeline.test.tsx | 120 +-
.../ui/src/layouts/Details/Gantt/GanttTimeline.tsx | 20 +-
.../ui/src/layouts/Details/Gantt/utils.test.ts | 122 +-
.../airflow/ui/src/layouts/Details/Gantt/utils.ts | 50 +-
.../airflow/ui/src/layouts/Details/Grid/Bar.tsx | 3 +-
.../ui/src/layouts/Details/Grid/GridButton.tsx | 4 +-
.../ui/src/layouts/Details/Grid/GridTI.test.tsx | 13 +
.../airflow/ui/src/layouts/Details/Grid/GridTI.tsx | 10 +-
.../layouts/Details/Grid/TaskInstancesColumn.tsx | 1 +
.../ui/src/layouts/Details/Grid/TaskNames.tsx | 5 +-
.../Asset/AssetStateStore/AssetStateStore.test.tsx | 123 ++
.../Asset/AssetStateStore/AssetStateStore.tsx | 14 +-
.../ui/src/pages/Dag/Versions/VersionDiff.test.tsx | 4 +-
.../src/pages/DagsList/PartitionScheduleModal.tsx | 1 +
.../airflow/ui/src/pages/Events/Events.test.tsx | 61 +
.../src/airflow/ui/src/pages/Events/Events.tsx | 8 +-
.../pages/GroupTaskInstance/GroupTaskInstance.tsx | 1 +
.../GroupTaskInstance/GroupTaskInstances.test.tsx | 93 ++
.../pages/GroupTaskInstance/GroupTaskInstances.tsx | 47 +
.../ui/src/pages/GroupTaskInstance/Header.tsx | 19 +
.../LoopIterations/IterationSelect.test.tsx | 107 ++
.../LoopIterations/IterationSelect.tsx | 155 ++
.../{ => LoopIterations}/index.ts | 3 +-
.../LoopIterations/loopUtils.test.ts | 110 ++
.../GroupTaskInstance/LoopIterations/loopUtils.ts | 58 +
.../ui/src/pages/GroupTaskInstance/index.ts | 2 +-
.../GroupTaskInstance/useLoopOutcomeStats.tsx | 74 +
.../pages/HITLTaskInstances/HITLResponseForm.tsx | 2 +
.../src/airflow/ui/src/pages/ReactPlugin.test.tsx | 28 +-
.../src/airflow/ui/src/pages/ReactPlugin.tsx | 4 +
.../airflow/ui/src/pages/Run/Execution.test.tsx | 512 +++++++
.../src/airflow/ui/src/pages/Run/Execution.tsx | 325 ++++
airflow-core/src/airflow/ui/src/pages/Run/Run.tsx | 1 +
.../airflow/ui/src/pages/Task/GroupTaskHeader.tsx | 7 +-
.../pages/Task/Overview/LoopHistoryChart.test.tsx | 129 ++
.../src/pages/Task/Overview/LoopHistoryChart.tsx | 137 ++
.../ui/src/pages/Task/Overview/Overview.test.tsx | 43 +-
.../ui/src/pages/Task/Overview/Overview.tsx | 9 +-
.../ui/src/pages/TaskInstance/AssetEvents.test.tsx | 61 +
.../ui/src/pages/TaskInstance/AssetEvents.tsx | 8 +-
.../ui/src/pages/TaskInstance/BlockingDeps.tsx | 2 +
.../ui/src/pages/TaskInstance/Details.test.tsx | 19 +-
.../airflow/ui/src/pages/TaskInstance/Details.tsx | 64 +-
.../ui/src/pages/TaskInstance/ExtraLinks.test.tsx | 20 +-
.../ui/src/pages/TaskInstance/ExtraLinks.tsx | 3 +
.../ui/src/pages/TaskInstance/HITLResponse.tsx | 4 +
.../ui/src/pages/TaskInstance/Header.test.tsx | 32 +-
.../airflow/ui/src/pages/TaskInstance/Header.tsx | 24 +-
.../pages/TaskInstance/Logs/ExternalLogLink.tsx | 6 +-
.../ui/src/pages/TaskInstance/Logs/Logs.tsx | 28 +-
.../pages/TaskInstance/Logs/LogsTryNumber.test.tsx | 25 +
.../src/pages/TaskInstance/Logs/TaskLogHeader.tsx | 6 +-
.../src/pages/TaskInstance/RenderedTemplates.tsx | 3 +
.../src/pages/TaskInstance/TaskInstance.test.tsx | 253 +++-
.../ui/src/pages/TaskInstance/TaskInstance.tsx | 116 +-
.../TaskInstances/BulkClearTaskInstancesButton.tsx | 126 +-
.../BulkDeleteTaskInstancesButton.tsx | 3 +
.../BulkMarkTaskInstancesAsButton.tsx | 13 +-
.../DeleteTaskInstanceButton.test.tsx | 58 +
.../TaskInstances/DeleteTaskInstanceButton.tsx | 3 +
.../src/pages/TaskInstances/TaskInstances.test.tsx | 88 +-
.../ui/src/pages/TaskInstances/TaskInstances.tsx | 50 +-
.../ClearAllTaskStateStoreButton.tsx | 4 +-
.../TaskStateStore/DeleteTaskStateStoreButton.tsx | 4 +-
.../pages/TaskStateStore/TaskStateStore.test.tsx | 114 ++
.../ui/src/pages/TaskStateStore/TaskStateStore.tsx | 4 +
.../TaskStateStore/TaskStateStoreModal.test.tsx | 81 +
.../pages/TaskStateStore/TaskStateStoreModal.tsx | 5 +-
.../airflow/ui/src/pages/XCom/AddXComButton.tsx | 4 +
.../airflow/ui/src/pages/XCom/DeleteXComButton.tsx | 2 +
.../airflow/ui/src/pages/XCom/EditXComButton.tsx | 2 +
.../src/airflow/ui/src/pages/XCom/XCom.tsx | 24 +-
.../airflow/ui/src/pages/XCom/XComEntry.test.tsx | 46 +-
.../src/airflow/ui/src/pages/XCom/XComEntry.tsx | 15 +-
.../airflow/ui/src/pages/XCom/XComModal.test.tsx | 82 ++
.../src/airflow/ui/src/pages/XCom/XComModal.tsx | 21 +-
.../airflow/ui/src/queries/gridViewQueryKeys.ts | 4 +
.../airflow/ui/src/queries/useBulkClearDryRun.ts | 114 --
.../ui/src/queries/useBulkClearTaskInstances.ts | 133 --
.../ui/src/queries/useBulkMarkAsDryRun.test.tsx | 76 +
.../airflow/ui/src/queries/useBulkMarkAsDryRun.ts | 4 +-
.../ui/src/queries/useClearTaskInstances.test.tsx | 82 ++
.../ui/src/queries/useClearTaskInstances.ts | 38 +-
.../queries/useClearTaskInstancesDryRun.test.tsx | 88 ++
.../ui/src/queries/useClearTaskInstancesDryRun.ts | 57 +-
.../src/airflow/ui/src/queries/useIsLoopGroup.ts | 18 +-
.../src/airflow/ui/src/queries/useLogs.test.ts | 44 +-
.../src/airflow/ui/src/queries/useLogs.tsx | 22 +-
.../src/airflow/ui/src/queries/useLoopHistory.ts | 13 +-
.../airflow/ui/src/queries/useLoopSummary.test.tsx | 93 ++
.../src/airflow/ui/src/queries/useLoopSummary.ts | 77 +
.../ui/src/queries/usePatchTaskInstance.test.tsx | 60 +
.../airflow/ui/src/queries/usePatchTaskInstance.ts | 6 +-
.../ui/src/queries/usePatchTaskInstanceDryRun.ts | 2 +
.../ui/src/queries/useTaskInstanceNote.test.tsx | 54 +
.../airflow/ui/src/queries/useTaskInstanceNote.ts | 2 +-
.../airflow/ui/src/queries/useUpdateHITLDetail.ts | 6 +
airflow-core/src/airflow/ui/src/router.tsx | 6 +-
.../airflow/ui/src/utils/executionParams.test.ts | 18 +-
.../src/airflow/ui/src/utils/executionParams.ts | 28 +-
.../src/airflow/ui/src/utils/links.test.ts | 15 +
airflow-core/src/airflow/ui/src/utils/links.ts | 18 +-
.../src/airflow/ui/src/utils/loopTaskInstance.ts | 10 +-
airflow-core/src/airflow/utils/db.py | 5 +-
airflow-core/src/airflow/utils/db_cleanup.py | 8 +-
.../src/airflow/utils/log/file_task_handler.py | 42 +-
.../src/airflow/utils/log/task_log_address.py | 268 ++++
airflow-core/src/airflow/utils/sqlalchemy.py | 57 +-
.../unit/api_fastapi/common/test_parameters.py | 12 +
.../routes/public/test_asset_state_store.py | 55 +
.../core_api/routes/public/test_assets.py | 61 +
.../core_api/routes/public/test_dag_run.py | 212 ++-
.../core_api/routes/public/test_dag_warning.py | 6 +-
.../core_api/routes/public/test_event_logs.py | 205 ++-
.../core_api/routes/public/test_execution.py | 177 +++
.../core_api/routes/public/test_extra_links.py | 111 +-
.../core_api/routes/public/test_hitl.py | 140 ++
.../api_fastapi/core_api/routes/public/test_log.py | 129 +-
.../core_api/routes/public/test_task_instances.py | 1546 +++++++++++++++++++-
.../routes/public/test_task_state_store.py | 143 +-
.../core_api/routes/public/test_xcom.py | 164 ++-
.../api_fastapi/core_api/routes/test_routes.py | 22 +
.../core_api/routes/ui/test_execution.py | 82 ++
.../api_fastapi/core_api/routes/ui/test_gantt.py | 47 +
.../api_fastapi/core_api/routes/ui/test_grid.py | 435 +++++-
.../routes/ui/test_partitioned_dag_runs.py | 48 +-
.../core_api/routes/ui/test_structure.py | 28 +
.../core_api/services/ui/test_execution.py | 72 +
.../unit/api_fastapi/execution_api/test_app.py | 2 +-
.../versions/head/test_asset_state_store.py | 52 +
.../versions/head/test_task_instances.py | 1441 +++++++++++++++++-
.../versions/head/test_task_state_store.py | 27 +-
.../execution_api/versions/head/test_xcoms.py | 682 ++++++++-
.../versions/v2026_10_30/test_task_instances.py | 16 +
.../unit/api_fastapi/logging/test_decorators.py | 67 +
airflow-core/tests/unit/assets/test_manager.py | 43 +-
.../tests/unit/callbacks/test_callback_requests.py | 13 +-
.../tests/unit/cli/commands/test_dag_command.py | 40 +-
.../unit/cli/commands/test_partition_command.py | 53 +-
.../unit/cli/commands/test_state_store_command.py | 10 +-
.../tests/unit/cli/commands/test_task_command.py | 283 +++-
.../tests/unit/dag_processing/test_collection.py | 24 +
.../tests/unit/dag_processing/test_dagbag.py | 86 +-
.../tests/unit/dag_processing/test_processor.py | 35 +
.../tests/unit/executors/test_base_executor.py | 11 +
.../tests/unit/executors/test_workloads.py | 159 +-
airflow-core/tests/unit/jobs/test_scheduler_job.py | 716 ++++++++-
airflow-core/tests/unit/jobs/test_triggerer_job.py | 44 +-
.../test_0143_add_dynamic_region_storage.py | 231 +++
.../test_0144_rename_stored_map_index.py | 324 ++++
airflow-core/tests/unit/models/conftest.py | 113 ++
airflow-core/tests/unit/models/test_asset.py | 87 +-
airflow-core/tests/unit/models/test_cleartasks.py | 868 ++++++++++-
airflow-core/tests/unit/models/test_dag.py | 63 +-
airflow-core/tests/unit/models/test_dagrun.py | 904 +++++++++++-
.../tests/unit/models/test_dynamic_region.py | 885 +++++++++++
airflow-core/tests/unit/models/test_log.py | 92 +-
.../tests/unit/models/test_mappedoperator.py | 414 +++++-
.../tests/unit/models/test_task_coordinates.py | 635 ++++++++
airflow-core/tests/unit/models/test_task_data.py | 22 +-
.../tests/unit/models/test_task_state_store.py | 18 +-
.../tests/unit/models/test_taskinstance.py | 402 ++++-
airflow-core/tests/unit/models/test_xcom_arg.py | 242 +++
.../unit/serialization/definitions/test_assets.py | 19 +
.../unit/serialization/test_dag_serialization.py | 104 +-
.../unit/serialization/test_dag_version_diff.py | 31 +
airflow-core/tests/unit/state/test_metastore.py | 136 ++
.../ti_deps/deps/test_mapped_task_upstream_dep.py | 33 +-
.../ti_deps/deps/test_ready_to_reschedule_dep.py | 28 +
.../unit/ti_deps/deps/test_trigger_rule_dep.py | 295 +++-
.../tests/unit/timetables/test_assets_timetable.py | 144 +-
.../unit/timetables/test_partitioned_timetable.py | 54 +-
.../tests/unit/utils/log/test_task_log_address.py | 362 +++++
airflow-core/tests/unit/utils/test_db.py | 20 +
airflow-core/tests/unit/utils/test_db_cleanup.py | 49 +-
airflow-core/tests/unit/utils/test_log_handlers.py | 1 +
airflow-core/tests/unit/utils/test_sqlalchemy.py | 62 +-
.../src/airflowctl/api/datamodels/generated.py | 75 +
airflow-ctl/src/airflowctl/ctl/cli_config.py | 30 +-
.../tests/airflow_ctl/api/test_operations.py | 2 +
.../airflow_ctl/ctl/commands/test_task_command.py | 3 +
.../tests/airflow_ctl/ctl/test_cli_config.py | 60 +-
airflow-e2e-tests/docker/java.yml | 10 +-
airflow-e2e-tests/docker/ts.yml | 12 +
.../.gitignore | 0
.../java-native-bundle/build.gradle | 38 +-
.../gradle.properties | 0
.../java-native-bundle/settings.gradle | 21 +-
.../apache/airflow/e2e/NativeBundleBuilder.java | 150 ++
.../airflow/e2e/nativedag/AnnotationDag.java | 106 ++
.../apache/airflow/e2e/nativedag/TargetDag.java | 28 +-
.../tests/airflow_e2e_tests/conftest.py | 59 +-
.../tests/airflow_e2e_tests/constants.py | 5 +
.../airflow_e2e_tests/e2e_test_utils/clients.py | 36 +
.../java_sdk_tests/test_java_sdk_native_dag.py | 215 +++
.../ts_sdk_tests/test_ts_sdk_hitl.py | 200 +++
.../ts_sdk_tests/test_ts_sdk_native_dag.py | 253 ++++
dev/breeze/doc/05_test_commands.rst | 10 +-
dev/breeze/doc/ci/04_selective_checks.md | 17 +-
dev/breeze/doc/images/output_k8s.svg | 26 +-
dev/breeze/doc/images/output_k8s.txt | 2 +-
.../doc/images/output_k8s_run-complete-tests.svg | 6 +-
.../doc/images/output_k8s_run-complete-tests.txt | 2 +-
.../doc/images/output_k8s_setup-lang-sdk-test.svg | 28 +-
.../doc/images/output_k8s_setup-lang-sdk-test.txt | 2 +-
.../airflow_breeze/commands/kubernetes_commands.py | 531 ++++---
.../commands/kubernetes_commands_config.py | 3 +-
.../src/airflow_breeze/commands/ui_commands.py | 8 +-
.../src/airflow_breeze/utils/selective_checks.py | 15 +
.../tests/test_kubernetes_lang_sdk_commands.py | 196 ++-
dev/breeze/tests/test_selective_checks.py | 55 +
dev/breeze/tests/test_ui_commands.py | 9 +
devel-common/src/sphinx_exts/airflow_spelling.py | 8 +-
.../src/sphinx_exts/docs_build/spelling_checks.py | 3 +
devel-common/src/tests_common/pytest_plugin.py | 15 +
.../src/tests_common/test_utils/asserts.py | 20 +
.../tests_common/test_utils/attempt_ownership.py | 10 +-
.../src/tests_common/test_utils/taskinstance.py | 8 +-
.../sphinx_exts/docs_build/test_spelling_checks.py | 18 +
.../unit/sphinx_exts/test_airflow_spelling.py | 4 +-
docs/spelling_wordlist.txt | 4 +
go-sdk/internal/genspec/authoring.go | 2 +
go-sdk/pkg/execution/genmodels/models.gen.go | 75 +-
go-sdk/schema/dag-schema.json | 12 +
go-sdk/schema/supervisor-schema.json | 101 ++
java-sdk/sdk/build.gradle.kts | 1 +
java-sdk/sdk/schema/dag-schema.json | 12 +
kubernetes-tests/lang_sdk/Dockerfile.java | 31 -
kubernetes-tests/lang_sdk/Dockerfile.runtimes | 49 +
kubernetes-tests/lang_sdk/README.md | 145 +-
.../lang_sdk/airflowignore_all | 0
kubernetes-tests/lang_sdk/config/values.yaml | 67 +-
..._sdk_combined.py => lang_sdk_mixed_language.py} | 30 +-
kubernetes-tests/lang_sdk/go_example/main.go | 21 +-
.../airflow/k8sexample/K8sBundleBuilder.java | 4 +-
...binedExample.java => MixedLanguageExample.java} | 16 +-
.../lang_sdk/pod_templates/lang_sdk_golang.yaml | 118 --
.../{lang_sdk_java.yaml => lang_sdk_worker.yaml} | 60 +-
kubernetes-tests/lang_sdk/stage_artifacts.py | 92 --
kubernetes-tests/lang_sdk/ts_example/.gitignore | 3 +
.../lang_sdk/ts_example}/package.json | 5 +-
.../lang_sdk/ts_example/pnpm-lock.yaml | 336 +++++
kubernetes-tests/lang_sdk/ts_example/src/main.ts | 47 +
.../lang_sdk/ts_example}/tsconfig.json | 13 +-
...executor.py => test_lang_sdk_mixed_language.py} | 24 +-
.../kubernetes_tests/test_lang_sdk_native_dag.py | 206 +++
.../docs/auth-manager/setup/identity-center.rst | 10 +
.../amazon/aws/auth_manager/routes/login.py | 9 +-
.../amazon/aws/auth_manager/routes/test_login.py | 27 +-
.../aws/executors/batch/test_batch_executor.py | 31 +-
.../amazon/aws/executors/ecs/test_ecs_executor.py | 31 +-
.../kubernetes/operators/test_spark_kubernetes.py | 4 +-
providers/common/ai/.pre-commit-config.yaml | 2 +-
providers/common/ai/docs/agent_security.rst | 14 +-
providers/common/ai/docs/capabilities.rst | 10 +-
providers/common/ai/docs/changelog.rst | 11 +
providers/common/ai/docs/hitl_review.rst | 5 +
providers/common/ai/docs/operators/agent.rst | 11 +-
providers/common/ai/docs/operators/llm.rst | 53 +-
providers/common/ai/docs/stability.rst | 5 +-
providers/common/ai/docs/toolsets/hook.rst | 11 +-
providers/common/ai/docs/toolsets/logging.rst | 30 +-
providers/common/ai/docs/toolsets/sql.rst | 16 +
.../providers/common/ai/durable/fingerprint.py | 19 +-
.../common/ai/example_dags/example_agent.py | 4 +-
.../common/ai/example_dags/example_hook_toolset.py | 2 +-
.../providers/common/ai/mixins/usage_budget.py | 152 ++
.../airflow/providers/common/ai/operators/agent.py | 109 +-
.../airflow/providers/common/ai/operators/llm.py | 49 +-
.../providers/common/ai/operators/llm_branch.py | 8 +-
.../common/ai/operators/llm_file_analysis.py | 5 +-
.../common/ai/operators/llm_schema_compare.py | 20 +-
.../providers/common/ai/operators/llm_sql.py | 8 +-
.../providers/common/ai/plugins/hitl_review.py | 125 +-
.../providers/common/ai/plugins/www/package.json | 1 +
.../providers/common/ai/plugins/www/src/api.ts | 13 +-
.../ai/plugins/www/src/components/ChatPage.tsx | 9 +-
.../common/ai/plugins/www/src/hooks/useSession.ts | 5 +-
.../providers/common/ai/plugins/www/src/main.tsx | 46 +-
.../common/ai/plugins/www/tests/api.test.ts | 63 +
.../common/ai/plugins/www/tests/main.test.mjs | 43 +
.../airflow/providers/common/ai/tools/__init__.py | 8 +-
.../airflow/providers/common/ai/toolsets/hook.py | 40 +-
.../providers/common/ai/toolsets/logging.py | 51 +-
.../providers/common/ai/toolsets/sandbox.py | 16 +-
.../airflow/providers/common/ai/utils/logging.py | 11 -
.../providers/common/ai/utils/usage_budget.py | 15 +-
.../common/ai/tests/unit/common/ai/conftest.py | 48 +
.../tests/unit/common/ai/decorators/test_agent.py | 12 +-
.../unit/common/ai/durable/test_fingerprint.py | 15 +
.../unit/common/ai/mixins/test_usage_budget.py | 190 +++
.../tests/unit/common/ai/operators/test_agent.py | 463 ++++--
.../ai/tests/unit/common/ai/operators/test_llm.py | 246 +++-
.../unit/common/ai/operators/test_llm_branch.py | 121 +-
.../common/ai/operators/test_llm_file_analysis.py | 88 +-
.../common/ai/operators/test_llm_schema_compare.py | 129 +-
.../tests/unit/common/ai/operators/test_llm_sql.py | 121 +-
.../unit/common/ai/plugins/test_hitl_review.py | 469 +++++-
.../unit/common/ai/tools/test__from_toolset.py | 2 +-
.../ai/tests/unit/common/ai/tools/test_tools.py | 5 +-
.../ai/tests/unit/common/ai/toolsets/test_hook.py | 58 +-
.../tests/unit/common/ai/toolsets/test_logging.py | 135 +-
.../tests/unit/common/ai/toolsets/test_sandbox.py | 24 +-
.../ai/tests/unit/common/ai/utils/test_logging.py | 17 -
.../unit/common/ai/utils/test_sql_validation.py | 163 ++-
providers/common/io/docs/state_store_backend.rst | 4 +-
providers/common/io/provider.yaml | 4 +-
.../providers/common/io/get_provider_info.py | 2 +-
.../providers/common/io/state_store/backend.py | 32 +-
.../airflow/providers/common/io/version_compat.py | 1 +
.../unit/common/io/state_store/test_backend.py | 49 +-
.../src/airflow/providers/edge3/cli/api_client.py | 19 +-
.../src/airflow/providers/edge3/cli/worker.py | 3 +
.../providers/edge3/worker_api/datamodels.py | 7 +
.../providers/edge3/worker_api/routes/logs.py | 31 +-
.../edge3/worker_api/v2-edge-generated.yaml | 28 +
.../edge3/tests/unit/edge3/cli/test_api_client.py | 52 +
.../edge3/tests/unit/edge3/cli/test_worker.py | 31 +-
.../unit/edge3/worker_api/routes/test_logs.py | 139 ++
.../providers/elasticsearch/log/es_task_handler.py | 3 +-
.../unit/elasticsearch/log/test_es_task_handler.py | 6 +
.../providers/openlineage/plugins/facets.py | 7 +-
.../providers/openlineage/plugins/listener.py | 37 +-
.../providers/openlineage/plugins/macros.py | 6 +-
.../airflow/providers/openlineage/utils/utils.py | 163 ++-
.../providers/openlineage/version_compat.py | 3 +-
.../unit/openlineage/plugins/test_listener.py | 71 +
.../tests/unit/openlineage/plugins/test_macros.py | 40 +-
.../tests/unit/openlineage/plugins/test_utils.py | 39 +-
.../tests/unit/openlineage/utils/test_utils.py | 285 +++-
.../providers/opensearch/log/os_task_handler.py | 3 +-
.../unit/opensearch/log/test_os_task_handler.py | 6 +
.../docs/operators/snowflake_cortex_agent.rst | 108 +-
.../snowflake/operators/snowflake_cortex_agent.py | 278 +++-
.../snowflake/example_snowflake_cortex_agent.py | 60 +-
.../operators/test_snowflake_cortex_agent.py | 309 +++-
.../check_template_context_variable_in_sync.py | 2 +
scripts/ci/prek/ts_compile_lint_common_ai.py | 1 +
shared/state/src/airflow_shared/state/__init__.py | 48 +-
shared/state/tests/state/test_state.py | 28 +
task-sdk/docs/api.rst | 2 +
task-sdk/docs/concepts.rst | 2 +-
task-sdk/docs/deferred-vs-async-operators.rst | 12 +-
task-sdk/docs/dynamic-task-mapping.rst | 8 +-
task-sdk/docs/examples.rst | 4 +-
task-sdk/src/airflow/sdk/__init__.py | 3 +
task-sdk/src/airflow/sdk/__init__.pyi | 2 +
task-sdk/src/airflow/sdk/api/client.py | 50 +-
.../src/airflow/sdk/api/datamodels/_generated.py | 17 +
task-sdk/src/airflow/sdk/bases/decorator.py | 27 +-
task-sdk/src/airflow/sdk/bases/operator.py | 1 +
task-sdk/src/airflow/sdk/bases/xcom.py | 2 +
.../src/airflow/sdk/definitions/_internal/loop.py | 218 +++
.../src/airflow/sdk/definitions/_internal/node.py | 15 +-
.../src/airflow/sdk/definitions/asset/__init__.py | 13 +
task-sdk/src/airflow/sdk/definitions/context.py | 4 +-
task-sdk/src/airflow/sdk/definitions/dag.py | 62 +-
.../sdk/definitions/decorators/task_group.py | 39 +-
.../src/airflow/sdk/definitions/mappedoperator.py | 1 -
task-sdk/src/airflow/sdk/definitions/taskgroup.py | 45 +-
.../airflow/sdk/definitions/timetables/assets.py | 51 +-
task-sdk/src/airflow/sdk/definitions/xcom_arg.py | 3 +-
task-sdk/src/airflow/sdk/exceptions.py | 4 +
task-sdk/src/airflow/sdk/execution_time/comms.py | 4 +
.../airflow/sdk/execution_time/lazy_sequence.py | 4 +
task-sdk/src/airflow/sdk/execution_time/loop.py | 104 ++
.../airflow/sdk/execution_time/request_handlers.py | 34 +-
.../airflow/sdk/execution_time/schema/schema.json | 101 ++
.../sdk/execution_time/schema/versions/__init__.py | 4 +
.../execution_time/schema/versions/v2026_10_30.py | 35 +-
.../src/airflow/sdk/execution_time/supervisor.py | 6 +-
.../src/airflow/sdk/execution_time/task_runner.py | 58 +-
task-sdk/src/airflow/sdk/log.py | 33 +-
task-sdk/src/airflow/sdk/types.py | 9 +-
.../task_sdk/definitions/_internal/test_loop.py | 431 ++++++
.../task_sdk/definitions/decorators/test_result.py | 39 +-
.../definitions/decorators/test_task_group.py | 120 +-
task-sdk/tests/task_sdk/definitions/test_asset.py | 16 +
task-sdk/tests/task_sdk/definitions/test_dag.py | 334 ++++-
.../tests/task_sdk/definitions/test_xcom_arg.py | 51 +-
.../task_sdk/definitions/timetables/test_assets.py | 166 +++
.../execution_time/schema/test_migrator.py | 81 +-
.../tests/task_sdk/execution_time/test_comms.py | 16 +-
.../tests/task_sdk/execution_time/test_loop.py | 245 ++++
.../execution_time/test_request_handlers.py | 51 +
.../task_sdk/execution_time/test_supervisor.py | 42 +-
.../task_sdk/execution_time/test_task_runner.py | 111 +-
task-sdk/tests/task_sdk/test_log.py | 32 +
ts-sdk/README.md | 94 +-
ts-sdk/adr/0002-native-dag-interface.md | 18 +-
ts-sdk/api-docs/dag-authoring-api.ts | 1 +
ts-sdk/{vitest.config.ts => api-docs/hitl-api.ts} | 18 +-
ts-sdk/capabilities.yaml | 9 +-
ts-sdk/example/README.md | 5 +
ts-sdk/example/package.json | 4 +-
ts-sdk/example/src/ai-approval.ts | 198 +++
ts-sdk/example/src/hitl.ts | 137 ++
ts-sdk/example/src/main.ts | 12 +-
ts-sdk/example/src/native.ts | 167 +++
ts-sdk/example/tsconfig.json | 4 +-
ts-sdk/package.json | 4 +
ts-sdk/schema/dag-schema.json | 12 +
ts-sdk/schema/supervisor-schema.json | 101 ++
ts-sdk/scripts/generate-dag-schema.mjs | 2 +
ts-sdk/src/coordinator/client.ts | 19 +
ts-sdk/src/coordinator/operator-runner.ts | 140 ++
ts-sdk/src/coordinator/protocol.ts | 4 +
ts-sdk/src/coordinator/runtime.ts | 63 +-
ts-sdk/src/coordinator/serde.ts | 275 +---
ts-sdk/src/generated/supervisor.ts | 35 +
.../GroupTaskInstance => ts-sdk/src/hitl}/index.ts | 12 +-
ts-sdk/src/hitl/operator.ts | 281 ++++
ts-sdk/src/hitl/spec.ts | 447 ++++++
ts-sdk/src/sdk/bundle.ts | 30 +-
ts-sdk/src/sdk/dag-graph.ts | 236 +++
ts-sdk/src/sdk/dag.ts | 117 +-
.../dag-authoring-api.ts => src/sdk/env.ts} | 33 +-
ts-sdk/src/sdk/operator.ts | 150 ++
ts-sdk/src/sdk/plain-json.ts | 60 +
.../trigger-dag-run-execute.ts} | 106 +-
ts-sdk/src/sdk/trigger-dag-run.ts | 43 +-
ts-sdk/tests/coordinator/integration.test.ts | 561 ++++++-
ts-sdk/tests/coordinator/operator-runner.test.ts | 207 +++
ts-sdk/tests/hitl/operator.test.ts | 169 +++
ts-sdk/tests/hitl/spec.test.ts | 353 +++++
ts-sdk/tests/public-api.test.ts | 6 +
ts-sdk/tests/sdk/dag.test.ts | 35 +
ts-sdk/tests/sdk/hitl-inference.test.ts | 117 ++
ts-sdk/tests/sdk/native-dag-example.test.ts | 213 +++
ts-sdk/tests/sdk/trigger-dag-run.test.ts | 21 +-
ts-sdk/tsconfig.json | 12 +-
ts-sdk/vitest.config.ts | 15 +
779 files changed, 49786 insertions(+), 5922 deletions(-)
create mode 100644
airflow-core/docs/authoring-and-scheduling/loops-and-mapped-tasks.rst
create mode 100644 airflow-core/docs/authoring-and-scheduling/loops.rst
create mode 100644 airflow-core/newsfragments/68517.significant.rst
create mode 100644 airflow-core/newsfragments/73746.significant.rst
create mode 100644 airflow-core/newsfragments/task-loops.feature.rst
create mode 100644 airflow-core/src/airflow/api_fastapi/common/region.py
copy airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/{gantt.py =>
execution.py} (52%)
create mode 100644
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/execution.py
create mode 100644
airflow-core/src/airflow/api_fastapi/core_api/services/public/task_coordinates.py
create mode 100644
airflow-core/src/airflow/api_fastapi/core_api/services/ui/execution.py
copy airflow-core/src/airflow/api_fastapi/{core_api/datamodels/ui/gantt.py =>
execution_api/versions/v2026_10_30_xcom_params.py} (52%)
create mode 100644 airflow-core/src/airflow/example_dags/example_task_loops.py
create mode 100644
airflow-core/src/airflow/migrations/versions/0143_3_4_0_add_dynamic_region_storage.py
create mode 100644
airflow-core/src/airflow/migrations/versions/0144_3_4_0_rename_stored_map_index.py
create mode 100644
airflow-core/src/airflow/migrations/versions/0145_3_4_0_add_task_identity_to_events.py
create mode 100644
airflow-core/src/airflow/migrations/versions/0146_3_4_0_add_asset_state_writer_identity.py
create mode 100644 airflow-core/src/airflow/models/dynamic_region.py
create mode 100644 airflow-core/src/airflow/models/task_coordinates.py
create mode 100644
airflow-core/src/airflow/ui/src/components/AssetProgressCell.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/hooks/useHITLReviewTabs.test.tsx
create mode 100644 airflow-core/src/airflow/ui/src/hooks/useLoopRuleStats.tsx
create mode 100644
airflow-core/src/airflow/ui/src/hooks/useSelectedVersion.test.tsx
copy ts-sdk/vitest.config.ts =>
airflow-core/src/airflow/ui/src/hooks/useTaskInstanceCoordinates.ts (64%)
create mode 100644
airflow-core/src/airflow/ui/src/hooks/useTaskInstanceView.test.ts
create mode 100644 airflow-core/src/airflow/ui/src/hooks/useTaskInstanceView.ts
create mode 100644 airflow-core/src/airflow/ui/src/i18n/locales.test.ts
create mode 100644
airflow-core/src/airflow/ui/src/pages/Asset/AssetStateStore/AssetStateStore.test.tsx
create mode 100644 airflow-core/src/airflow/ui/src/pages/Events/Events.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/GroupTaskInstances.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/GroupTaskInstances.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/LoopIterations/IterationSelect.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/LoopIterations/IterationSelect.tsx
copy airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/{ =>
LoopIterations}/index.ts (93%)
create mode 100644
airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/LoopIterations/loopUtils.test.ts
create mode 100644
airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/LoopIterations/loopUtils.ts
create mode 100644
airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/useLoopOutcomeStats.tsx
create mode 100644 airflow-core/src/airflow/ui/src/pages/Run/Execution.test.tsx
create mode 100644 airflow-core/src/airflow/ui/src/pages/Run/Execution.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/Task/Overview/LoopHistoryChart.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/Task/Overview/LoopHistoryChart.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/TaskInstances/DeleteTaskInstanceButton.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStore.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStoreModal.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/pages/XCom/XComModal.test.tsx
delete mode 100644
airflow-core/src/airflow/ui/src/queries/useBulkClearDryRun.ts
delete mode 100644
airflow-core/src/airflow/ui/src/queries/useBulkClearTaskInstances.ts
create mode 100644
airflow-core/src/airflow/ui/src/queries/useBulkMarkAsDryRun.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/queries/useClearTaskInstances.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/queries/useClearTaskInstancesDryRun.test.tsx
copy ts-sdk/vitest.config.ts =>
airflow-core/src/airflow/ui/src/queries/useIsLoopGroup.ts (54%)
copy ts-sdk/vitest.config.ts =>
airflow-core/src/airflow/ui/src/queries/useLoopHistory.ts (70%)
create mode 100644
airflow-core/src/airflow/ui/src/queries/useLoopSummary.test.tsx
create mode 100644 airflow-core/src/airflow/ui/src/queries/useLoopSummary.ts
create mode 100644
airflow-core/src/airflow/ui/src/queries/usePatchTaskInstance.test.tsx
create mode 100644
airflow-core/src/airflow/ui/src/queries/useTaskInstanceNote.test.tsx
copy ts-sdk/vitest.config.ts =>
airflow-core/src/airflow/ui/src/utils/executionParams.test.ts (59%)
copy
kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
=> airflow-core/src/airflow/ui/src/utils/executionParams.ts (57%)
copy ts-sdk/vitest.config.ts =>
airflow-core/src/airflow/ui/src/utils/loopTaskInstance.ts (74%)
create mode 100644 airflow-core/src/airflow/utils/log/task_log_address.py
create mode 100644
airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_execution.py
create mode 100644
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_execution.py
create mode 100644
airflow-core/tests/unit/api_fastapi/core_api/services/ui/test_execution.py
create mode 100644
airflow-core/tests/unit/migrations/test_0143_add_dynamic_region_storage.py
create mode 100644
airflow-core/tests/unit/migrations/test_0144_rename_stored_map_index.py
create mode 100644 airflow-core/tests/unit/models/conftest.py
create mode 100644 airflow-core/tests/unit/models/test_dynamic_region.py
create mode 100644 airflow-core/tests/unit/models/test_task_coordinates.py
create mode 100644 airflow-core/tests/unit/utils/log/test_task_log_address.py
copy airflow-e2e-tests/{java-test-bundle => java-native-bundle}/.gitignore
(100%)
copy
kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
=> airflow-e2e-tests/java-native-bundle/build.gradle (55%)
copy airflow-e2e-tests/{java-test-bundle =>
java-native-bundle}/gradle.properties (100%)
copy ts-sdk/vitest.config.ts =>
airflow-e2e-tests/java-native-bundle/settings.gradle (68%)
create mode 100644
airflow-e2e-tests/java-native-bundle/src/java/org/apache/airflow/e2e/NativeBundleBuilder.java
create mode 100644
airflow-e2e-tests/java-native-bundle/src/java/org/apache/airflow/e2e/nativedag/AnnotationDag.java
copy
kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
=>
airflow-e2e-tests/java-native-bundle/src/java/org/apache/airflow/e2e/nativedag/TargetDag.java
(50%)
create mode 100644
airflow-e2e-tests/tests/airflow_e2e_tests/java_sdk_tests/test_java_sdk_native_dag.py
create mode 100644
airflow-e2e-tests/tests/airflow_e2e_tests/ts_sdk_tests/test_ts_sdk_hitl.py
create mode 100644
airflow-e2e-tests/tests/airflow_e2e_tests/ts_sdk_tests/test_ts_sdk_native_dag.py
delete mode 100644 kubernetes-tests/lang_sdk/Dockerfile.java
create mode 100644 kubernetes-tests/lang_sdk/Dockerfile.runtimes
copy manifests/.gitignore => kubernetes-tests/lang_sdk/airflowignore_all (100%)
rename kubernetes-tests/lang_sdk/dags/{lang_sdk_combined.py =>
lang_sdk_mixed_language.py} (68%)
rename
kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/{CombinedExample.java
=> MixedLanguageExample.java} (71%)
delete mode 100644 kubernetes-tests/lang_sdk/pod_templates/lang_sdk_golang.yaml
rename kubernetes-tests/lang_sdk/pod_templates/{lang_sdk_java.yaml =>
lang_sdk_worker.yaml} (57%)
delete mode 100644 kubernetes-tests/lang_sdk/stage_artifacts.py
create mode 100644 kubernetes-tests/lang_sdk/ts_example/.gitignore
copy {ts-sdk/example => kubernetes-tests/lang_sdk/ts_example}/package.json
(71%)
create mode 100644 kubernetes-tests/lang_sdk/ts_example/pnpm-lock.yaml
create mode 100644 kubernetes-tests/lang_sdk/ts_example/src/main.ts
copy {ts-sdk => kubernetes-tests/lang_sdk/ts_example}/tsconfig.json (54%)
rename
kubernetes-tests/tests/kubernetes_tests/{test_lang_sdk_coordinator_executor.py
=> test_lang_sdk_mixed_language.py} (78%)
create mode 100644
kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_native_dag.py
create mode 100644
providers/common/ai/src/airflow/providers/common/ai/mixins/usage_budget.py
create mode 100644
providers/common/ai/src/airflow/providers/common/ai/plugins/www/tests/api.test.ts
create mode 100644
providers/common/ai/src/airflow/providers/common/ai/plugins/www/tests/main.test.mjs
create mode 100644
providers/common/ai/tests/unit/common/ai/mixins/test_usage_budget.py
create mode 100644 task-sdk/src/airflow/sdk/definitions/_internal/loop.py
create mode 100644 task-sdk/src/airflow/sdk/execution_time/loop.py
create mode 100644 task-sdk/tests/task_sdk/definitions/_internal/test_loop.py
create mode 100644
task-sdk/tests/task_sdk/definitions/timetables/test_assets.py
create mode 100644 task-sdk/tests/task_sdk/execution_time/test_loop.py
copy ts-sdk/{vitest.config.ts => api-docs/hitl-api.ts} (78%)
create mode 100644 ts-sdk/example/src/ai-approval.ts
create mode 100644 ts-sdk/example/src/hitl.ts
create mode 100644 ts-sdk/example/src/native.ts
create mode 100644 ts-sdk/src/coordinator/operator-runner.ts
copy {airflow-core/src/airflow/ui/src/pages/GroupTaskInstance =>
ts-sdk/src/hitl}/index.ts (81%)
create mode 100644 ts-sdk/src/hitl/operator.ts
create mode 100644 ts-sdk/src/hitl/spec.ts
create mode 100644 ts-sdk/src/sdk/dag-graph.ts
copy ts-sdk/{api-docs/dag-authoring-api.ts => src/sdk/env.ts} (60%)
create mode 100644 ts-sdk/src/sdk/operator.ts
create mode 100644 ts-sdk/src/sdk/plain-json.ts
rename ts-sdk/src/{coordinator/trigger-runner.ts =>
sdk/trigger-dag-run-execute.ts} (67%)
create mode 100644 ts-sdk/tests/coordinator/operator-runner.test.ts
create mode 100644 ts-sdk/tests/hitl/operator.test.ts
create mode 100644 ts-sdk/tests/hitl/spec.test.ts
create mode 100644 ts-sdk/tests/sdk/hitl-inference.test.ts
create mode 100644 ts-sdk/tests/sdk/native-dag-example.test.ts