Skip to content

Send TS SDK logs to stderr on socket disconnect#69302

Merged
jason810496 merged 3 commits into
apache:mainfrom
guan404ming:worktree-ts-log-buffering
Jul 19, 2026
Merged

Send TS SDK logs to stderr on socket disconnect#69302
jason810496 merged 3 commits into
apache:mainfrom
guan404ming:worktree-ts-log-buffering

Conversation

@guan404ming

@guan404ming guan404ming commented Jul 3, 2026

Copy link
Copy Markdown
Member

Related Issue

closes: #69292

Why

Logs emitted after an unexpected log socket close were silently lost. Since both socket ends always run on the same host, a disconnect means the peer died and reconnecting cannot help (see the discussion in #69696), so instead of buffering/reconnecting, later records fall back to stderr, which the coordinator already captures into the task log.

How

  • Warn once on an unexpected socket close and route subsequent log records to stderr
  • No buffering or reconnect machinery

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Fable 5)

Generated-by: Claude Code (Fable 5) following the guidelines

@guan404ming
guan404ming marked this pull request as ready for review July 3, 2026 10:31
@guan404ming
guan404ming force-pushed the worktree-ts-log-buffering branch from f027101 to 94eb11e Compare July 4, 2026 08:30

@shivaam shivaam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please also refer to my comment on #69292
I am wondering if we even need this right now or not.

Comment thread ts-sdk/src/coordinator/log-channel.ts Outdated
Comment thread ts-sdk/src/coordinator/log-channel.ts Outdated
Comment thread ts-sdk/src/coordinator/log-channel.ts Outdated
@guan404ming guan404ming self-assigned this Jul 10, 2026
@guan404ming guan404ming mentioned this pull request Jul 11, 2026
1 task
@guan404ming
guan404ming marked this pull request as draft July 11, 2026 17:06
@guan404ming
guan404ming force-pushed the worktree-ts-log-buffering branch from 5ae7000 to 7798020 Compare July 11, 2026 17:15
@guan404ming guan404ming changed the title Buffer TypeScript SDK logs across log socket disconnects Send TypeScript SDK logs to stderr when the log socket disconnects Jul 11, 2026
@guan404ming
guan404ming force-pushed the worktree-ts-log-buffering branch from 7798020 to bd60158 Compare July 11, 2026 17:19
@guan404ming
guan404ming marked this pull request as ready for review July 13, 2026 12:31

@jason810496 jason810496 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Continue on #69696 (comment) this discussion. IIUC, It seems the current PR already refactor as what you mentioned in above comment right?

Comment thread ts-sdk/src/coordinator/log-channel.ts
Comment thread ts-sdk/src/coordinator/log-channel.ts
@guan404ming guan404ming changed the title Send TypeScript SDK logs to stderr when the log socket disconnects Send TS SDK logs to stderr on socket disconnect Jul 16, 2026
@guan404ming

Copy link
Copy Markdown
Member Author

Continue on #69696 (comment) this discussion. IIUC, It seems the current PR already refactor as what you mentioned in above comment right?

Yes, this one has been refactored as what we discussed there!

@guan404ming
guan404ming force-pushed the worktree-ts-log-buffering branch 2 times, most recently from 42ae0ad to ce87ee9 Compare July 16, 2026 13:54
@guan404ming
guan404ming requested a review from jason810496 July 16, 2026 13:55
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
@guan404ming
guan404ming force-pushed the worktree-ts-log-buffering branch from ce87ee9 to 955c80e Compare July 18, 2026 06:05
Comment thread ts-sdk/src/coordinator/log-channel.ts
Comment thread ts-sdk/src/coordinator/log-channel.ts Outdated
Comment thread ts-sdk/src/coordinator/log-channel.ts Outdated
Comment thread ts-sdk/src/coordinator/log-channel.ts
@guan404ming

Copy link
Copy Markdown
Member Author

@jason810496 would you want to take another look before merge? thanks!

@jason810496 jason810496 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks.

@jason810496
jason810496 merged commit 372025f into apache:main Jul 19, 2026
65 checks passed
@jason810496 jason810496 moved this to Done in TS-SDK Jul 20, 2026
@jason810496 jason810496 added this to the TS SDK 1.0 Beta milestone Jul 20, 2026
dabla pushed a commit to dabla/airflow that referenced this pull request Jul 21, 2026
* Send TypeScript SDK logs to stderr when the log socket disconnects

Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>

* Harden TS SDK log channel shutdown

* Unref log channel close flush timer so it cannot delay process exit

---------

Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
eladkal pushed a commit that referenced this pull request Jul 22, 2026
…#70007)

* Flag missing conn-fields when hook-only files change in static checks

* Add missing Dutch translations (#68742)

* Add missing  Dutch translations

* Fix common.ai durable execution skipping Toolset-capability tools (#69881)

When durable=True, tools supplied via a pydantic-ai Toolset capability
(capabilities=[Toolset(ts)]) bypassed the CachingToolset applied to
toolsets=, so their results re-executed on every retry instead of
replaying. Wrap the inner toolset of concrete Toolset capabilities with
the same CachingToolset. A Toolset capability backed by a callable
factory can't be wrapped (it resolves per run) and now logs a warning.

Also fixes two latent durable-execution bugs found in review:

- cleanup() ran before the message-history XCom push and output
  serialization. A failure in either wiped the cache, so the retry
  re-ran every already-completed step. Move cleanup to after them.

- the pre-3.3 ObjectStorage cache filename joined dag/task/run with "_",
  aliasing distinct tasks (dag "etl"/task "load_data" and dag
  "etl_load"/task "data" both mapped to one file, so one task could
  read, overwrite, or delete another's cache). Hash the identity
  components instead.

* Don't deactivate DAG bundles owned by other dag-processors (#69964)

`DagBundlesManager.sync_bundles_to_db()` marks every stored bundle that is
not in the calling process's config as inactive. This assumes the caller
sees the complete bundle configuration.

When multiple dag-processors are each configured with a partial config (one
bundle per processor, a natural way to shard parsing), each processor treats
the other processors' bundles as "no longer found in config" and disables
them. Processor A disables B's bundle, B disables A's, and they flip
`dag_bundle.active` on every parse cycle -- the deployment never converges
and continuously logs "DAG bundle ... is no longer found in config and has
been disabled" for bundles that are actively configured elsewhere.

Add a `deactivate_missing` flag (default `True`, preserving existing
single-processor behavior) and have `DagFileProcessorManager.sync_bundles()`
pass `deactivate_missing=False` when the processor was started with a bundle
filter (`--bundle-name` / `bundle_names_to_parse`), i.e. when it only owns a
subset of the bundles.

closes: #69963
related: #69698

Generated-by: Claude Code following the guidelines

* Authorize Dag reparse against the file's Dags, not the query-string dag_id (#69471)

* Authorize Dag reparse against the file's Dags, not the query-string dag_id

The PUT /parseDagFile/{file_token} endpoint authorized the caller through a route dependency that, with no dag_id path parameter, resolves the target from the query string, which is decoupled from the Dag file the signed file_token actually resolves to.

Add a requires_access_dag_from_file_token dependency that decodes the token, resolves the Dags defined in that file, and authorizes the caller against exactly those Dags, so authorization always matches the Dag being reparsed regardless of any request parameter.

* Update airflow-core/src/airflow/api_fastapi/core_api/security.py

Co-authored-by: Amogh Desai <amoghrajesh1999@gmail.com>

* Fix CI

---------

Co-authored-by: Amogh Desai <amoghrajesh1999@gmail.com>

* Restore graph task and group coloring via Chakra palette tokens (#68760)

* Restore graph task and group coloring via Chakra palette tokens

Custom operator and TaskGroup colors disappeared in Airflow 3: the
ui_color/ui_fgcolor attributes were kept but the new UI ignored them, so
teams that relied on color to parse large graphs at a glance lost that
signal (see the demand on the linked issue).

Bring the coloring back in a way that fits the new opinionated theming:
the value must be a Chakra palette token (e.g. blue.500), which resolves
through a theme-controlled CSS variable and therefore stays legible in
both light and dark mode and under custom themes -- the dark-mode and
accessibility concerns that drove the original removal. The graph paints
the node fill from ui_color and the operator label from ui_fgcolor, as in
Airflow 2.x, while the border keeps showing run state. Legacy hex/named
values can no longer adapt to the theme, so they are ignored by the graph
and emit a warning for user-authored operators and task groups.

* Color task groups in the graph view, including when expanded

ui_color and ui_fgcolor are documented as the fill and label colors of a
TaskGroup node, and Airflow 2.x painted them, but the graph excluded groups
from the custom fill and dropped the colors entirely once a group was
expanded. Treat groups like leaf tasks so a token-valued group color renders
its fill and label in both the collapsed and expanded states.

* Accept raw hex colors and Chakra tokens for graph node coloring

Review feedback asked to keep the Airflow 2 behavior where ui_color and ui_fgcolor accept a raw color (a hex code or CSS name) in addition to Chakra palette tokens, so existing Dags keep their graph colors without any change. Dark-mode color variants are deferred to a follow-up.

* Adjustments

* Fix unreadable graph task text on light custom colors in dark mode

The task icon and label fell back to the theme's default foreground for Chakra token fills, so a light token such as yellow.200 rendered light text on a light fill in dark mode. Deriving the text color from the resolved fill measures tokens too, so contrast holds for hex, CSS names, and tokens alike.

* Update task group graph test fixture for restored node colors

The graph serializer now emits each node's ui_color/ui_fgcolor for task
and group nodes, so the expected graph fixture must include them; join
nodes stay uncolored. The fixture was stale and omitted these fields,
failing test_task_group_to_dict_serialized_dag and
test_task_group_to_dict_alternative_syntax.

* Document semantic theme tokens for ui_color and ui_fgcolor

The graph node color attributes accept theme-aware semantic tokens (e.g.
brand.solid) that adapt to light and dark mode, in addition to palette tokens
and raw colors — but the docs only mentioned palette tokens, so users had no
pointer to the semantic tokens available in the UI theme.

* Skip Go SDK CI jobs for doc-only changes under go-sdk/ (#70021)

go-sdk/*.md edits (README, ADRs) currently match the Go SDK file groups
and trigger the Go unit + e2e suites plus a prod image build, none of
which a documentation change can affect. Excluding .md also lets
non-.go build files (go.mod, go.sum, build config) trigger the unit
tests, which the previous .go-only pattern missed.

* Enhance/standardize documentation for `AssetOrTimeSchedule` (#69831)

* UI: Lazy-mount the pause confirmation dialog on Dag cards and rows (#70016)

* Skip ts-sdk supervisor schema check for doc-only changes (#70022)

ts-sdk/*.md edits (e.g. README) currently match TS_SDK_FILES and keep
the check-ts-sdk-supervisor-schema prek hook from being skipped, so a
documentation-only change needlessly regenerates and diffs the
generated supervisor schema. Documentation does not affect it.

* Use atomic upsert for asset run queue on MySQL to avoid deadlocks (#69977)

Under concurrent asset-event fan-out, the per-row SAVEPOINT loop used for
non-PostgreSQL backends deadlocks on MySQL/InnoDB and surfaces confusing
"SAVEPOINT ... does not exist" errors, and the deadlock is not retried.
Route MySQL to a single-statement INSERT ... ON DUPLICATE KEY UPDATE,
mirroring the existing PostgreSQL path, so the enqueue is atomic and holds
locks far more briefly.

closes: #69938

* Pin task bundle manifest to the dagrun's version (#69941)

A mid-run DAG re-parse possibly creates a new DagVersion and bumps
not-yet-started task instances' dag_version_id, while the DagRun
stays pinned to its original bundle_version. ExecuteTask.make()
sourced the bundle version from the run's pin (dag_run.bundle_version)
but bundle version_data from the task's now-bumped dag_version,
so the workload shipped a hash and a manifest that describe
different versions. This double source was noticed for the callback
path in a previous PR, but the task path was missed.

Source version_data from the run's pinned created_dag_version so it always
matches the bundle version, mirroring ExecuteCallback.make() and the way Git
bundles resolve everything from the run's pinned commit.

* Allow configuring XCom sidecar container security context (#69613)

* Allow configuring XCom sidecar container security context

* fix CI error

* fix CI error #2

* Update providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/pod.py

Co-authored-by: Przemysław Mirowski <17602603+Miretpl@users.noreply.github.com>

* fix CI error

---------

Co-authored-by: Przemysław Mirowski <17602603+Miretpl@users.noreply.github.com>

* Add missing newsfragment to Helm Chart (#70043)

* Remove duplicated newsfragments

* Add missing newsfragments

* Consolidate Airflow version newsfragment

* Update doc (#70047)

* Fix `@task.llm_branch` import failure on Task SDK-only workers (#70068)

* Reject unsupported require_approval in LLM branch and schema compare operators (#70069)

* Fix stale docs.sqlalchemy.org/en/14 pooling link in config.yml (#69751)

* Java SDK: Throw MissingXComException instead of NPE for absent XComs (#69257)

Signed-off-by: PoAn Yang <payang@apache.org>

* Rename Kafka Listener to Kafka Event Producer and update the documentation (#70014)

* Set stream=False for Snowflake Cortex Agent requests. (#69731)

* Send Airflow CLI logs to stderr for -o commands so structured output stays parseable (#68598)

* Document task subprocess lifecycle and pre-connect log buffer (#70076)

* Enhancing docs for `HttpEventTrigger` (#70073)

* docs/http-event-trigger: Enhancing docs for HttpEventTrigger

* Apply suggestions from code review

Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>

---------

Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>

* Add Amazon ECR repository operators (#69886)

* Prevent negative trigger queue delay metrics (#69971)

* Bump the uv-dependency-updates group in /dev/breeze with 2 updates (#70033)

Bumps the uv-dependency-updates group in /dev/breeze with 2 updates: [gitpython](https://github.com/gitpython-developers/GitPython) and [prek](https://github.com/j178/prek).


Updates `gitpython` from 3.1.50 to 3.1.51
- [Release notes](https://github.com/gitpython-developers/GitPython/releases)
- [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES)
- [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.50...3.1.51)

Updates `prek` from 0.4.8 to 0.4.9
- [Release notes](https://github.com/j178/prek/releases)
- [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md)
- [Commits](https://github.com/j178/prek/compare/v0.4.8...v0.4.9)

---
updated-dependencies:
- dependency-name: gitpython
  dependency-version: 3.1.51
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: uv-dependency-updates
- dependency-name: prek
  dependency-version: 0.4.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: uv-dependency-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump the github-actions-updates group across 1 directory with 9 updates (#70040)

Bumps the github-actions-updates group with 9 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/setup-java](https://github.com/actions/setup-java) | `5.4.0` | `5.5.0` |
| [actions/setup-node](https://github.com/actions/setup-node) | `6.4.0` | `7.0.0` |
| [slackapi/slack-github-action](https://github.com/slackapi/slack-github-action) | `3.0.3` | `3.0.5` |
| [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) | `6.2.1` | `6.2.2` |
| [github/codeql-action/init](https://github.com/github/codeql-action) | `4.36.2` | `4.37.0` |
| [github/codeql-action/autobuild](https://github.com/github/codeql-action) | `4.36.2` | `4.37.0` |
| [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.36.2` | `4.37.0` |
| [actions/stale](https://github.com/actions/stale) | `10.3.0` | `10.4.0` |
| [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) | `8.2.0` | `8.3.2` |



Updates `actions/setup-java` from 5.4.0 to 5.5.0
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/1bcf9fb12cf4aa7d266a90ae39939e61372fe520...0f481fcb613427c0f801b606911222b5b6f3083a)

Updates `actions/setup-node` from 6.4.0 to 7.0.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e...820762786026740c76f36085b0efc47a31fe5020)

Updates `slackapi/slack-github-action` from 3.0.3 to 3.0.5
- [Release notes](https://github.com/slackapi/slack-github-action/releases)
- [Changelog](https://github.com/slackapi/slack-github-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/slackapi/slack-github-action/compare/45a88b9581bfab2566dc881e2cd66d334e621e2c...0d95c9a7becc1e6e297d76df9bc735c44f4cbcbc)

Updates `aws-actions/configure-aws-credentials` from 6.2.1 to 6.2.2
- [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases)
- [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md)
- [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/254c19bd240aabef8777f48595e9d2d7b972184b...517a711dbcd0e402f90c77e7e2f81e849156e31d)

Updates `github/codeql-action/init` from 4.36.2 to 4.37.0
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...99df26d4f13ea111d4ec1a7dddef6063f76b97e9)

Updates `github/codeql-action/autobuild` from 4.36.2 to 4.37.0
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...99df26d4f13ea111d4ec1a7dddef6063f76b97e9)

Updates `github/codeql-action/analyze` from 4.36.2 to 4.37.0
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...99df26d4f13ea111d4ec1a7dddef6063f76b97e9)

Updates `actions/stale` from 10.3.0 to 10.4.0
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899...1e223db275d687790206a7acac4d1a11bd6fe629)

Updates `astral-sh/setup-uv` from 8.2.0 to 8.3.2
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/fac544c07dec837d0ccb6301d7b5580bf5edae39...11f9893b081a58869d3b5fccaea48c9e9e46f990)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 5.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/setup-node
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions-updates
- dependency-name: slackapi/slack-github-action
  dependency-version: 3.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: aws-actions/configure-aws-credentials
  dependency-version: 6.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: github/codeql-action/init
  dependency-version: 4.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: github/codeql-action/autobuild
  dependency-version: 4.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/stale
  dependency-version: 10.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: astral-sh/setup-uv
  dependency-version: 8.3.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Fix CI integration tests gated by the wrong platform (#70015)

Signed-off-by: PoAn Yang <payang@apache.org>

* Fix mypy prek hooks skipping all files in dot-directory (#70064)

Signed-off-by: PoAn Yang <payang@apache.org>

* Document 3.3.0 image databricks constraint fix in Dockerfile changelog (#70083)

Record in the 'Changes after publishing the images' table that the 3.3.0 Python 3.11/3.12 images had their downgraded databricks stack corrected (provider 6.13.0 -> 7.16.1, connector 2.0.2 -> 4.2.5, thrift 0.23.0 -> 0.16.0).

related: #69603

* Fix DocumentLoaderOperator ignoring unknown parser on byte input (#70071)

* Fix DocumentLoaderOperator ignoring unknown parser on byte input

* Validate explicit parser in _resolve_backend

* Send TS SDK logs to stderr on socket disconnect (#69302)

* Send TypeScript SDK logs to stderr when the log socket disconnects

Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>

* Harden TS SDK log channel shutdown

* Unref log channel close flush timer so it cannot delay process exit

---------

Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>

* Build Go SDK e2e example bundle natively in CI (#69909)

* Build Go SDK e2e example bundle natively in CI

* Capture build output and remove path duplication in Go SDK e2e bundle build

The native/containerized build branch was inlined with no output capture, so a
failed CI build surfaced only a bare traceback, unlike the Java SDK's helper
which prints the build log on failure. The containerized path also hardcoded
/repo/go-sdk/bin instead of deriving it from the already-imported
GO_SDK_ROOT_PATH/GO_SDK_BIN_PATH constants, and the Go build cache key ignored
go.mod so a toolchain bump alone wouldn't invalidate it.

* i18n(ko): translate Dag list run-state filter labels (#69781)

* Preserve output_type through human approval in LLM operators (#70075)

* Preserve output_type through human approval in LLM operators

* Cover BaseModel in output_type restore test

* Clarify the dags reserialize command scope (#69810)

* Add Task SDK, Go and Java SDK execution architecture diagrams (#69750)

* Add Task SDK, Go and Java SDK execution architecture diagrams

Add graphviz-generated diagrams to the architecture overview showing how a
task actually runs across the different SDKs, and embed them in
core-concepts/overview.rst:

- Python Task SDK: supervised (two native OS processes over a msgpack socket)
  vs native/in-process paths, plus a numbered message-flow sequence.
- Go SDK: standalone edge worker pulling from the Edge API, task talks to the
  Execution API directly.
- Java (JVM) SDK: Coordinator layer reusing the Python Supervisor, driving a
  JVM subprocess over loopback TCP, with an architecture diagram and a numbered
  execution-workflow sequence.

* Draw Task and Java SDK execution flows as true sequence diagrams

The message-flow diagrams added earlier in this PR drew every step on a single
vertical spine, so the request/response round-trips between the task runtime and
the Supervisor were hard to follow. Responding to review feedback, redraw them
as true sequence diagrams — one lifeline per participant with the Supervisor in
the middle — so each round-trip reads as arrows going back and forth between
neighboring lifelines, with straight message arrows and margined labels.

* Discount CI image-build time from duration-trend alerts (#69789)

* Discount CI image-build time from duration-trend alerts

The CI duration monitor folded the "Prepare breeze & CI image" step into
each job's total. That step occasionally balloons on a one-off cache miss
(a full image rebuild instead of a cached pull), which repeatedly flagged
unrelated jobs as regressed — e.g. a Non-DB core job reported +190% driven
almost entirely by an 18m image build, while its actual test time was flat.

Image-build time is now excluded from the run and per-job durations used
for the trend, and the image build is watched on its own: it is only
reported when it has stayed slow for more than two days, so a transient
rebuild spike no longer produces a false alert.

* Apply naming nits: prefix duration helpers with calculate_

Rename work_duration -> calculate_work_duration,
run_image_build_seconds -> calculate_image_build_seconds,
adjusted_run_duration -> calculate_adjusted_run_duration for a
consistent calculate_ prefix on the duration-computing helpers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* Clarify AssetPartitionDagRun provisional-run docstring (#69982)

The previous wording ("we should not allow more than one like this") did not
state the actual invariant. Make explicit that rows are never deleted — so
multiple records per target_dag_id/partition_key are expected — and that the
constraint is specifically at most one row with a null created_dag_run_id,
which the _lock_asset_model mutex enforces.

* fix/issue-70020: Adding cap to cloudpickle (#70086)

* Bring back edge worker metric compatibility with Airflow 3.2 (#67328)

* Bring back edge worker DualStatusManager compability

* Reworked statsd taging for pre airflow 3.3 versions

* Fix mypy

* document metrics compability issues

* fix doc

* Fix docu and added unit test

* Fix imports

* Fix unit test

* Fix flaky unit tests by reset after test execution

---------

Co-authored-by: AutomationDev85 <AutomationDev85>

* Replace vars(response) with attribute access in Azure Data Factory and Synapse operators for SDK v10 compatibility (#69689)

* fix(providers/azure): use attribute access instead of vars() for SDK v10 hybrid model compat

* added regression tests for azure data factory and azure synapse operators

* Fix ruff formatting in test_synapse.py

---------

Co-authored-by: Malte Niederstadt <M.Niederstadt@deutsche-glasfaser.de>

* Bump eslint (#70032)

Bumps the eslint group with 1 update in the /airflow-core/src/airflow/ui directory: [eslint](https://github.com/eslint/eslint).


Updates `eslint` from 10.6.0 to 10.7.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.6.0...v10.7.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 10.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* cncf-kubernetes: fix potential race condition in trigger_reentry flow caused by `is_istio_enabled` (#69269)

* Gracefully return istio check if pod is removed

This is meant to catch a potential race condition in the
`trigger_reentry` flow. There is already a check that the pod still
exists in the event of a success, but it is still possible for the pod
to be removed during the first and second API read. Should this happen,
we should return the same way as if no pod was provided to the function.

* Add log for missing pod in istio check

---------

Co-authored-by: Przemysław Mirowski <17602603+Miretpl@users.noreply.github.com>

* Upgrade http to https in PR template (#70063)

* Update SQLAlchemy documentation link from 1.4 to 2.0

* fix: upgrade http:// to https:// in .github/PULL_REQUEST_TEMPLATE.md

---------

Co-authored-by: hanu-14 <mohdhanan23@outlook.com>

* Make schema_fields templated in GCSToBigQueryOperator (#69108)

schema_fields was not a template field, so a templated value (a Variable
or XComArg resolving to a schema) passed to GCSToBigQueryOperator was never
rendered and reached BigQuery unresolved. Mark it templated, matching how
BigQueryUpdateTableSchemaOperator already templates schema_fields_updates.

* docs: fix stale Airflow 2.0 references in dev/README.md (#69961)

* docs: fix stale Airflow 2.0 references in dev/README.md

* docs: fix official_source typo and missing space in dev/README.md

Two small typos flagged in #69902 that were missed in the initial commit:
- Line 92: "official_source releases" -> "official source releases"
- Line 99: '"apache-airflow-providers"separately' -> '"apache-airflow-providers" separately'

* Refactor get_statsd_logger to use keyword arguments for clarity and add a test for ipv6 support in StatsD logger (#69632)

* Let area:e2e-tests label force the airflow-e2e-tests suite (#69993)

* Let area:e2e-test label force Airflow E2E tests

Contributors validating changes whose impact selective-checks' file heuristics miss otherwise have to request the full test matrix. A focused area label lets them run the standard Airflow E2E suite without unrelated test jobs.

* Use the plural E2E tests area label

* Automate keeping documented "tested with" versions in sync with the test matrix (#69124)

The Python, database and Kubernetes versions Airflow is tested with live in
global_constants.py, but are also listed by hand in the installation
prerequisites doc and the README. Those lists drifted: PostgreSQL 18 (and
MySQL 8.4) were added to the test matrix and the README, but the prerequisites
doc was forgotten, so it still advertised PostgreSQL up to 17.

Add a prek hook that regenerates the tested-versions block in prerequisites.rst
and the "Main version (dev)" column of the README from global_constants.py, so
this drift becomes an auto-fixable check failure instead of a silent doc bug.
Also correct the stale PostgreSQL and MySQL versions in prerequisites.rst.

Generated-by: Claude Code (Opus 4.8) following the guidelines

* Fix Breeze OpenLineage integration gate stuck on stale Postgres versions (#69264)

* Fix Breeze OpenLineage integration gate stuck on stale Postgres versions

The gate in enter_shell() hardcoded PostgreSQL 12/13/14 as the only
versions allowed with --integration openlineage, but Breeze's actual
matrix has moved to 14-18 (12 isn't even a valid choice anymore).
Derive the allowed set from CURRENT_POSTGRES_VERSIONS in
global_constants.py instead, so the gate can't drift out of sync with
the matrix again.

closes: #69233

* Cover --integration all in OpenLineage Postgres gate tests

Reviewer feedback on apache/airflow#69264: the gate also triggers on
"all" (not just "openlineage"), so the tests should exercise that path
too.

* Bump @visx/shape from 3.12.0 to 4.0.0 in /airflow-core/src/airflow/ui (#69722)

Bumps [@visx/shape](https://github.com/airbnb/visx) from 3.12.0 to 4.0.0.
- [Release notes](https://github.com/airbnb/visx/releases)
- [Changelog](https://github.com/airbnb/visx/blob/master/CHANGELOG.md)
- [Commits](https://github.com/airbnb/visx/compare/v3.12.0...v4.0.0)

---
updated-dependencies:
- dependency-name: "@visx/shape"
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Rename Task and Asset store to Task and Asset state store (#70097)

* i18n(ko): add missing translation for triggerDag.partitionKeyHelp (#70005)

* Add integration tests for coordinator-mode TypeScript tasks (#69328)

* Add integration tests for coordinator-mode TypeScript tasks

* Register ts_sdk e2e test mode in breeze CLI

* Exercise real airflow-ts-pack packing in TypeScript SDK e2e tests

The reviewer asked the e2e tests to wait for airflow-ts-pack and use its
real packing path. The example build now runs airflow-ts-pack, which embeds
the airflow metadata in bundle.mjs, so the hand-written
airflow-metadata.yaml sidecar would bypass the path users actually take.

* Trim ts_sdk e2e docstrings and comments to essentials

* Build TS SDK e2e example natively in CI and skip doc-only changes

* Suppress noisy Alembic plugin setup logs (#69916)

Alembic emits autogenerate plugin registration messages at INFO during CLI startup. Those unrelated lines contaminate machine-readable command output, while warnings and errors still need to remain visible.

* Fix ClickHouse test_connection unit test failing with newer clickhouse-connect (#70114)

* Fix ClickHouse test_connection unit test failing with newer clickhouse-connect

The assertion pinned the exact call signature that clickhouse_connect's
DB-API cursor uses internally, which changed in 1.4.x. Only the SQL sent
is relevant to what the test verifies, so the provider keeps working
across the whole supported clickhouse-connect range.

* Assert bound parameters too, not just the statement

Reviewer feedback: the statement and its parameters are Airflow's own
contract, so both belong in the assertion; only what the driver appends
on top of them is out of scope.

* Add running_pod_log_lines config option to KubernetesExecutor (#69301)

* Resolve conflict in KubernetesExecutor.__init__ and drop redundant comment

The running_pod_log_lines config addition conflicted with the
pod-launch-failure requeue state added to __init__ after this branch
diverged; keep both initializations. Also drops a comment that only
restated the line below it, per review feedback.

* Clarify fallback reference in KubernetesExecutor running_pod_log_lines

self.RUNNING_POD_LOG_LINES looked like a self-referential fallback since
it isn't set on the instance until this assignment completes; referencing
the class attribute directly makes clear it falls back to the class default.

* Bump the core-ui-package-updates group across 1 directory with 4 updates (#70037)

Bumps the core-ui-package-updates group with 4 updates in the /airflow-core/src/airflow/ui directory: [@tanstack/react-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual), [msw](https://github.com/mswjs/msw), [prettier](https://github.com/prettier/prettier) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@tanstack/react-virtual` from 3.14.5 to 3.14.6
- [Release notes](https://github.com/TanStack/virtual/releases)
- [Changelog](https://github.com/TanStack/virtual/blob/main/packages/react-virtual/CHANGELOG.md)
- [Commits](https://github.com/TanStack/virtual/commits/@tanstack/react-virtual@3.14.6/packages/react-virtual)

Updates `msw` from 2.14.6 to 2.15.0
- [Release notes](https://github.com/mswjs/msw/releases)
- [Changelog](https://github.com/mswjs/msw/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mswjs/msw/compare/v2.14.6...v2.15.0)

Updates `prettier` from 3.9.4 to 3.9.5
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.4...3.9.5)

Updates `vite` from 8.1.3 to 8.1.4
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.4/packages/vite)

---
updated-dependencies:
- dependency-name: "@tanstack/react-virtual"
  dependency-version: 3.14.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: core-ui-package-updates
- dependency-name: msw
  dependency-version: 2.15.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: core-ui-package-updates
- dependency-name: prettier
  dependency-version: 3.9.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: core-ui-package-updates
- dependency-name: vite
  dependency-version: 8.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: core-ui-package-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* UI: Complete Hindi (hi) translation coverage (#70111)

Adds the missing Hindi translations so the locale reaches full coverage
against the current English source, well above the 90% completeness
threshold defined in airflow-core/src/airflow/ui/public/i18n/README.md.

Covers:
- common.json: preset filters, keyboard-shortcut help dialog, note
  edit/preview/write, dagRun.partitionDate.
- admin.json: variables import parsing status.
- components.json: triggerDag partitionKeyHelp.
- dags.json: any/last run-state filters and the run-state count block.
- dashboard.json: alert see more/less toggles and pluralized count.
- hitl.json: review drawer and required-action list strings.

Also removes stale Hindi keys that were renamed or dropped on the English
side (asset_other, dagWarnings.error_other, and four keyboard-shortcut
copies in dag.json) so the locale no longer carries unused entries.

* Document GlueJobOperator support for OpenLineage Spark injection (#69652)

Signed-off-by: Maciej Obuchowski <maciej.obuchowski@datadoghq.com>

* Add API endpoint for backfill dag run entries (#67381)

* Add GET /backfills/{backfill_id}/dag_runs endpoint

Adds a new public API endpoint that returns the BackfillDagRun entries
for a given backfill with joined DagRun state. Users can see what
happened in a backfill: which dates ran, their states (queued, running,
success, failed), and which slots were skipped (with reason).

- BackfillDagRunResponse / BackfillDagRunCollectionResponse models
- LEFT OUTER JOIN via joinedload includes skipped slots (null dag_run_id)
- Pagination via limit/offset, default ordering by sort_ordinal
- 404 when backfill doesn't exist
- 8 unit tests covering happy path, skipped slots, 404, pagination,
  empty backfill, and ordering contract

closes: #46250

* Align backfill dag run response identifiers

* Update Weaviate examples for client 4.16 API (#67343)

* Restore pluggable email backend for task failure and retry alerts (#69877)

Since #57354, task email_on_failure / email_on_retry alerts were routed
unconditionally through SmtpNotifier, silently ignoring the
[email] email_backend configuration. Custom backends (SES, SendGrid,
org-internal) stopped delivering failure/retry emails even though the
deprecated email_on_* parameters still worked.

This restores the old behaviour using the existing [email] email_backend
option -- no new configuration is introduced:

- A non-default [email] email_backend is transparently wrapped in a new
  LegacyEmailBackendNotifier, so existing SES / SendGrid / custom backends
  keep delivering alerts unchanged. The backend is resolved from config at
  notify time, so the Task SDK keeps no static dependency on
  airflow.utils.email.
- Otherwise the default SmtpNotifier is used, exactly as before.

The notifier lives in the Task SDK (airflow.sdk.execution_time.email_backend)
next to its only caller, so no extra provider needs to be installed for a
custom email backend to keep working.

Both failure-email entry points (the worker task-runner path and the
DAG-processor callback path) funnel through the same function, so the
selected backend is used consistently regardless of how the task failed.

The deprecated email_on_* parameters are not un-deprecated; this only keeps
their existing behaviour pluggable until removal in Airflow 4.

* Add partition_key and partition_key_regexp_pattern filters for asset events (#64610)

* Add partition_key and partition_key_pattern filters for asset events

Add two new query parameters to the asset events API endpoints:

- partition_key: exact-match filter leveraging the new composite
  B-tree index on (asset_id, partition_key)
- partition_key_pattern: regex-based filter using database-native
  regexp_match for flexible pattern matching

Includes Core API, Execution API, Task SDK (InletEventsAccessor),
client, documentation, migration for the composite index, and tests.

Made-with: Cursor

* Regenerate supervisor schema snapshot for partition_key filters

* Add ReDoS safeguards for partition_key_pattern regex filter

The pattern is evaluated by the database's regex engine, so a pathological
pattern could consume DB CPU (ReDoS). Mitigations:

- Cap the pattern length (MAX_REGEX_PATTERN_LENGTH) in both the Core and
  Execution API validators, returning 400 for over-long patterns.
- Bound the regex query with a transaction-local statement_timeout on
  PostgreSQL (apply_regex_query_timeout); no-op elsewhere. MySQL bounds
  regex evaluation via its built-in regexp_time_limit; SQLite has no
  server-side regex and MariaDB is unsupported.
- Document the safeguards in assets.rst.

* Gate regex query filters behind a config flag with configurable timeout

Add two [api] configs (Airflow 3.4.0):

- enable_regexp_query_filters (bool, default False): the partition_key_pattern
  filter passes a user-supplied regex to the database engine, which is a ReDoS
  vector, so it is disabled by default and must be explicitly enabled. Exact-match
  partition_key filtering is unaffected.
- regexp_query_timeout (int seconds, default 30): the primary runtime mitigation,
  enforced as a PostgreSQL transaction-local statement_timeout; 0 disables it.

When the flag is off, partition_key_pattern requests return HTTP 400 on both the
Core and Execution APIs. Config descriptions document the security rationale.
Adds tests for the disabled path and the timeout helper.

* Revert pattern length cap for regex filters

Drop MAX_REGEX_PATTERN_LENGTH; the opt-in flag and the PostgreSQL
statement_timeout are the meaningful ReDoS safeguards, and a length cap
does not stop short catastrophic patterns while risking false rejections
of legitimate ones.

* Fix CI: enable regex flag for by-alias tests, regenerate TS SDK schema

- Add the enable_regexp_query_filters conf_vars fixture to
  TestGetAssetEventByAssetAliasPartitionKey (was missed), fixing the 4
  by-alias regex tests that now hit the default-off flag; add a
  disabled->400 test for the alias endpoint too.
- Regenerate ts-sdk/src/generated/supervisor.ts for the partition_key /
  partition_key_pattern comms fields (check-ts-sdk-supervisor-schema).

* Address review feedback on partition key regexp filter

- Rename the public/SDK parameter partition_key_pattern ->
  partition_key_regexp_pattern to distinguish regexp filtering from the
  substring "*_pattern" filters on other APIs.
- Move the enable_regexp_query_filters gate into _RegexParam construction
  and the regex compile check into depends_regex, so a regexp filter can
  never be instantiated without the setting being enabled.
- Drop the mutually-exclusive 400 between partition_key and
  partition_key_regexp_pattern (both now combine with AND) on the Core and
  Execution APIs and in the Task SDK client/accessor.
- Reuse the shared QueryAssetEventPartitionKeyFilter/Regex params in the
  Execution API asset-event routes instead of duplicating the query params
  and validation.
- Keep backend implementation details out of the public parameter
  description; simplify the config docs; revert an unrelated limit check.
- Regenerate OpenAPI specs, UI TS clients, and the supervisor schema
  snapshots.

* Collapse regexp config into one setting and scope the query timeout

Address further review feedback:

- Replace the enable_regexp_query_filters + regexp_query_timeout pair with a
  single [api] regexp_query_timeout: 0 (default) disables regexp filtering
  entirely, any positive value enables it and bounds the query runtime. This
  removes the "enabled but unbounded" combination.
- Make apply_regex_query_timeout a context manager that sets a transaction-local
  statement_timeout on enter and resets it on exit, so the bound is scoped to
  the regexp query and does not leak to other statements in the request's
  transaction. Both asset-event routes apply it automatically around query
  execution instead of relying on a manual call in the view.

* Regenerate UI query client for partition_key_regexp_pattern rename

The hand-applied rename missed the type-block declarations and JSDoc in the
generated query hooks (they were not on lines matching the AssetEvents hook
name). Regenerate with `pnpm codegen` so the UI client matches the OpenAPI
spec, fixing the "Compile / format / lint UI" static check.

* Fix provide_session positional static check in partition-key tests

The check-no-new-provide-session-positional hook flagged the partition-key
regexp tests. The nine test methods never used the injected session, so drop
their @provide_session decorator and unused session parameter; make session
keyword-only in the _create_partition_key_test_data helper that does use it.

* Address review: MySQL query timeout, float config, doc link, test tidy-up

- Enforce regexp_query_timeout on MySQL too (session max_execution_time),
  not just PostgreSQL statement_timeout; apply_regex_query_timeout now
  branches by dialect and is a no-op on SQLite.
- Make [api] regexp_query_timeout a float so fractional seconds (e.g. 0.5)
  are allowed; read it via conf.getfloat.
- Link the config option in assets.rst via :ref: and note the MySQL bound.
- Tests: create partition-key rows via an autouse fixture instead of a
  per-test helper call, fold the exact-match cases into parametrized tests
  (core + execution API), and cover the MySQL/float timeout paths.

* Restore previous db timeout instead of clearing it

Address review nit: apply_regex_query_timeout now captures the current
statement_timeout (PostgreSQL) / max_execution_time (MySQL) before overriding
it and restores that value on exit, instead of resetting to 0. This preserves
a server- or role-level global timeout rather than clobbering it.

* Apply regexp query timeout automatically via the filter dependency

Address review feedback: instead of relying on each view to wrap its query in
apply_regex_query_timeout (easy to forget -> ReDoS), the regexp filter's
dependency (regex_param_factory) now applies the timeout to the request's
session itself. Any endpoint using QueryAssetEventPartitionKeyRegex is bounded
automatically. The dependency is function-scoped so it can depend on the
session it bounds; the previous timeout value is restored on teardown. Removes
the manual wrappers from the core and execution asset-event routes and adds
tests for the dependency behavior.

* Optionally emit Dag tags as metric tags (#68568)

* Emit Dag tags as metric tags

Add a [metrics] dag_tags_in_metrics option (default False). When enabled, each
Dag tag becomes a metric tag on Dag-run and task-instance metrics: tags with a
colon (e.g. env:prod) split into a key/value pair; plain tags (e.g. production)
become standalone DogStatsd tags, or tag=true in InfluxDB line protocol. Built-in
keys (dag_id, run_type, task_id, team_name) win on collision.

Tags come from the DagRun's dag_model.tags. The scheduler hot loop
(get_running_dag_runs_to_examine) and the executor-event failure path eager-load
them (gated on the flag) to avoid per-DagRun queries; other in-session emission
paths fall back to a lazy load, so the tags reach all Dag-run and task-instance
metrics. DagRun.dag_tags_for_stats swallows SQLAlchemyError so a detached/expired
instance degrades to no tags rather than breaking the caller.

TaskInstance.stats_tags reuses DagRun.dag_tags_for_stats and adds task_id and
run_type; the Task SDK worker reads the in-memory Dag and also adds run_type, so
ti.* metrics carry a consistent tag set across the worker and scheduler emitters.

The build_dag_metric_tags helper lives in the shared observability stats module.

* Address review feedback on Dag tags metric emission

Keep the scheduler hot path free of per-task conf reads. Warm the dag tags via the existing
TaskInstance -> DagModel join rather than an extra dag_run hop, since the
DagModel is shared in the identity map. Fold the repeated dogstatsd tag-list
guard into a single helper, and consolidate the tag-formatting tests.

* Address further review nits on Dag tags metric emission

Make session a keyword-only argument on get_running_dag_runs_to_examine, in
line with the convention for session parameters. Reduce TaskInstance.stats_tags
to the dag run's tags plus the task-level ones, keeping the TI's transiently
resolved team_name when present.

* Source task instance team_name metric tag from the dag run

TaskInstance.stats_tags already reuses the dag run's stats tags, so take
team_name from there too rather than from a separate per-task transient
attribute, keeping a single source of truth for the tag.

The scheduling loop now stashes the resolved team on the dag run so
task-instance metrics still carry it. The heartbeat-purge path already tags
team inline, so its now-redundant per-task assignment is dropped.

* Add ADR-0006: no Lang-SDK source display for mixed-language (@task.stub) Dag (#70059)

* Add ADR-0006: no Lang-SDK source display for stub DAGs

* Drop the per-Dag source slicing argument from ADR-0006

That point argued against per-Dag filtering of the source view, but that
shape is essentially the upcoming per-file get_source_code on the AIP-85
DagImporter interface, so it is not a reason for this decision and would
read as pre-judging that work.

* [main] Upgrade important CI environment (#69999)

* [main] CI: Upgrade important CI environment

* Fix plugin validation type check for mypy 2.3.0

mypy 2.3.0 narrows the `inspect.isclass()` guard to `type[object]`, which does
not carry `validate`, so the four shared distributions that symlink
plugins_manager.py failed static checks. The MRO check immediately above
already establishes the class is an AirflowPlugin by name -- it cannot use
issubclass() because the shared library is reachable under two module paths --
so make that knowledge explicit to the type checker.

* Fix breeze tag listing type check for GitPython 3.1.52

GitPython 3.1.52 types `git.ls_remote` as the full union of git-command
return shapes, so mypy no longer accepts calling `splitlines()` on it and the
four static-check hooks that type-check dev/breeze failed. With plain
arguments the call always returns the command output, so say so.

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>

* Bump the auth-ui-package-updates group across 1 directory with 9 updates (#70105)

* Bump the auth-ui-package-updates group across 1 directory with 9 updates

Bumps the auth-ui-package-updates group with 9 updates in the /airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui directory:

| Package | From | To |
| --- | --- | --- |
| [@7nohe/openapi-react-query-codegen](https://github.com/7nohe/openapi-react-query-codegen) | `2.1.0` | `2.2.0` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.62.1` | `8.64.0` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.62.1` | `8.64.0` |
| [@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils) | `8.62.1` | `8.64.0` |
| [eslint](https://github.com/eslint/eslint) | `10.6.0` | `10.7.0` |
| [eslint-plugin-perfectionist](https://github.com/azat-io/eslint-plugin-perfectionist) | `5.9.1` | `5.10.0` |
| [prettier](https://github.com/prettier/prettier) | `3.9.4` | `3.9.5` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.62.1` | `8.64.0` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.1.3` | `8.1.4` |



Updates `@7nohe/openapi-react-query-codegen` from 2.1.0 to 2.2.0
- [Release notes](https://github.com/7nohe/openapi-react-query-codegen/releases)
- [Commits](https://github.com/7nohe/openapi-react-query-codegen/compare/v2.1.0...v2.2.0)

Updates `@typescript-eslint/eslint-plugin` from 8.62.1 to 8.64.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.64.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.62.1 to 8.64.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.64.0/packages/parser)

Updates `@typescript-eslint/utils` from 8.62.1 to 8.64.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/utils/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.64.0/packages/utils)

Updates `eslint` from 10.6.0 to 10.7.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.6.0...v10.7.0)

Updates `eslint-plugin-perfectionist` from 5.9.1 to 5.10.0
- [Release notes](https://github.com/azat-io/eslint-plugin-perfectionist/releases)
- [Changelog](https://github.com/azat-io/eslint-plugin-perfectionist/blob/main/changelog.md)
- [Commits](https://github.com/azat-io/eslint-plugin-perfectionist/compare/v5.9.1...v5.10.0)

Updates `prettier` from 3.9.4 to 3.9.5
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.4...3.9.5)

Updates `typescript-eslint` from 8.62.1 to 8.64.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.64.0/packages/typescript-eslint)

Updates `vite` from 8.1.3 to 8.1.4
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.4/packages/vite)

---
updated-dependencies:
- dependency-name: "@7nohe/openapi-react-query-codegen"
  dependency-version: 2.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: auth-ui-package-updates
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.64.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: auth-ui-package-updates
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.64.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: auth-ui-package-updates
- dependency-name: "@typescript-eslint/utils"
  dependency-version: 8.64.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: auth-ui-package-updates
- dependency-name: eslint
  dependency-version: 10.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: auth-ui-package-updates
- dependency-name: eslint-plugin-perfectionist
  dependency-version: 5.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: auth-ui-package-updates
- dependency-name: prettier
  dependency-version: 3.9.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: auth-ui-package-updates
- dependency-name: typescript-eslint
  dependency-version: 8.64.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: auth-ui-package-updates
- dependency-name: vite
  dependency-version: 8.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: auth-ui-package-updates
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update generated files

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: vincbeck <vincbeck@amazon.com>

* Add Asset Tab plugin (#69986)

* Add Asset Tab plugin

* Delete test_plugins.py

* [AIP-94] Add filters and pagination to airflowctl jobs list (#68616)

* Support legacy list-jobs filters in airflowctl jobs list

* Always default jobs list ordering to most recent start date

Previously the default order_by switched between the API default and
-start_date depending on whether --limit was given, making the output
ordering hard to predict. The legacy airflow dags list-jobs command
always ordered by start_date descending, so apply that default
unconditionally.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* Add AWS services toolset for agents to access 1000+ APIs (#70087)

* Add AWS services toolset for agents to access 1000+ APIs

* Fix basic tests

* Fix basic tests

* Move to helpers

* resolve comments

* Add more tests

* Update description

* parametrize tests

* Fix task instance mark success downstream default (#67763)

* Add worker-name filter to `airflow edge list-workers` (#70095)

* get the name pattern for the list-workers

* Rename list-workers name filter flag to --worker-name-pattern

Match the existing worker_name_pattern naming already used by the edge
REST/UI routes for consistency.

* Fix dag.test() dropping defer-time kwargs when trigger yields an event (#69942)

When DAG.test() runs a deferred task's trigger inline and the trigger
yields an event, the kwargs passed at defer() time were discarded and
replaced with only {"event": ...}. The resume method then ran with its
default argument values.

This broke example_neptune_analytics on the deferrable path:
NeptuneCreatePrivateGraphEndpointOperator defers with
kwargs={"vpc_id": self.vpc_id} and resumes into
execute_complete(..., vpc_id=""). The lost vpc_id fell back to "" and
was pushed to XCom; the downstream delete_endpoint task built a malformed
request URI (/graphs/<id>/endpoints/) and the service rejected it with
AccessDeniedException: Unable to determine service/operation name to be
authorized.

Merge the event into the deferral's next_kwargs instead of replacing
them, mirroring the production resume path in airflow.models.trigger.
Add a regression test.

* TriggerRunner: Add batch trigger creation duration metric (#68521)

Add a timing metric that records the time spent creating all pending triggers during a single create_triggers() invocation. Also, add a unit test verifying that the metric is emitted with the expected tags when triggers are successfully created.

* Bump axios in /providers/edge3/src/airflow/providers/edge3/plugins/www (#70145)

Bumps [axios](https://github.com/axios/axios) from 1.17.0 to 1.18.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.17.0...v1.18.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.18.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Remove airflow.utils dependency from Docker provider (#69900)

* Document that Code view shows only Python source for stub tasks (#70155)

* Remove deprecated dataset aliases (#70154)

Co-authored-by: SHIVANSH-ux-ys <singaser78@gmail.com>
Signed-off-by: viiccwen <vicwen@apache.org>

* Use canonical serde imports in tests (#70162)

Signed-off-by: viiccwen <vicwen@apache.org>

* Fix flaky static checks caused by migration-reference hook race (#70170)

The update-migration-references, -fab, and -edge3 hooks live in three
different prek workspaces that run in parallel, yet each invocation
processed all three apps and rewrote every migration file and
migrations-ref.rst even when nothing changed. Concurrent containers
racing on the same files intermittently failed CI static checks with
'revision = not found' when a reader caught a file mid-write.

Scope each hook to its own app and write files only when the content
actually changed, so no two hooks touch the same files.

* Add toolset as a provider module category (#70122)

* Fix toolsets python-modules check for common.ai provider (#70181)

* Harden common.ai SQLToolset allowed_tables against function/COPY bypass (#70134)

SQLToolset(allowed_tables=[...]) restricts which tables an LLM agent's SQL
can reach, but the check only inspected table references. A SQL function
whose argument is a file path or a SQL string carries no table node, so
pg_read_file('/etc/passwd'), query_to_xml('SELECT ... FROM other_table'),
and COPY ... FROM PROGRAM (under allow_writes) slipped past the guardrail.

collect_table_references now rejects COPY and -- fail-closed -- every
function sqlglot cannot type (exp.Anonymous), the channel those functions
use. Ordinary builtins (count, lower) are recognised and pass; a legitimate
unrecognised function (json_build_object) or a project UDF is permitted via
the new allowed_functions parameter. This avoids maintaining an unbounded
denylist of dangerous names and matches the module's allowlist philosophy:
an incomplete allow-list refuses a query, it never leaks.

The guardrail stays best-effort: a least-privilege database role remains the
hard boundary, and the docs, docstrings, and SQL example DAG lead with that
guidance.

---------

Signed-off-by: PoAn Yang <payang@apache.org>
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Maciej Obuchowski <maciej.obuchowski@datadoghq.com>
Signed-off-by: viiccwen <vicwen@apache.org>
Co-authored-by: Vincent Kling <vkling@vinniict.nl>
Co-authored-by: Kaxil Naik <kaxilnaik@gmail.com>
Co-authored-by: Sebastián Ortega <sebastian.ortegatorres@datadoghq.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Amogh Desai <amoghrajesh1999@gmail.com>
Co-authored-by: Andrew Chang <69671930+Andrushika@users.noreply.github.com>
Co-authored-by: Jake McGrath <116606359+jroachgolf84@users.noreply.github.com>
Co-authored-by: Yuseok Jo <yuseok89@gmail.com>
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
Co-authored-by: Niko Oliveira <onikolas@amazon.com>
Co-authored-by: Aaron Chen <nailo2c@gmail.com>
Co-authored-by: Przemysław Mirowski <17602603+Miretpl@users.noreply.github.com>
Co-authored-by: Guan-Ming Chiu <105915352+guan404ming@users.noreply.github.com>
Co-authored-by: Amitesh Gupta <143833521+singlaamitesh@users.noreply.github.com>
Co-authored-by: PoAn Yang <payang@apache.org>
Co-authored-by: Christos Bisias <christosbis@gmail.com>
Co-authored-by: SameerMesiah97 <75502260+SameerMesiah97@users.noreply.github.com>
Co-authored-by: Dheeraj Turaga <dheerajturaga@gmail.com>
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
Co-authored-by: Morgan <62363051+AlejandroMorgante@users.noreply.github.com>
Co-authored-by: Vic Wen <vicwen@apache.org>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Hojeong Park <parkhj062@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: AutomationDev85 <96178949+AutomationDev85@users.noreply.github.com>
Co-authored-by: Malte Niederstadt <116146665+MalteNiederstadt@users.noreply.github.com>
Co-authored-by: Malte Niederstadt <M.Niederstadt@deutsche-glasfaser.de>
Co-authored-by: Noah Gil <98035801+noah-gil@users.noreply.github.com>
Co-authored-by: MOHAMMED HANAN M T P <91409429+hanu-14@users.noreply.github.com>
Co-authored-by: hanu-14 <mohdhanan23@outlook.com>
Co-authored-by: Nikolaus Schuetz <nikolauspschuetz@gmail.com>
Co-authored-by: nagasrisai <59650078+nagasrisai@users.noreply.github.com>
Co-authored-by: ykuc <140019825+ykuc@users.noreply.github.com>
Co-authored-by: Aaryan Mahajan <aaryanmhjn@gmail.com>
Co-authored-by: 조현준 <101855229+aaiss0927@users.noreply.github.com>
Co-authored-by: Ephraim Anierobi <splendidzigy24@gmail.com>
Co-authored-by: Henry Chen <henrychen@apache.org>
Co-authored-by: Deepak kumar <deepakkumar@meta.com>
Co-authored-by: Maciej Obuchowski <obuchowski.maciej@gmail.com>
Co-authored-by: Shivam Rastogi <6463385+shivaam@users.noreply.github.com>
Co-authored-by: Hussein Awala <hussein@awala.fr>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: vincbeck <vincbeck@amazon.com>
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
Co-authored-by: GPK <gopidesupavan@gmail.com>
Co-authored-by: Aditya Patel <125534950+Codingaditya17@users.noreply.github.com>
Co-authored-by: Shubham Raj <48172486+shubhamraj-git@users.noreply.github.com>
Co-authored-by: Sean Ghaeli <58916776+seanghaeli@users.noreply.github.com>
Co-authored-by: Shae Alhusayni <shae.alh@gmail.com>
Co-authored-by: SHIVANSH-ux-ys <singaser78@gmail.com>
Co-authored-by: Wei Lee <weilee.rx@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

TypeScript SDK: log socket buffering and reconnect hardening

4 participants