Skip to content

src: fix libuv assertion on windows - #61999

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
liuxingbaoyu:fix-56645
Jul 24, 2026
Merged

src: fix libuv assertion on windows#61999
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
liuxingbaoyu:fix-56645

Conversation

@liuxingbaoyu

Copy link
Copy Markdown
Contributor

Set the pointer to nullptr after calling uv_close to avoid assertions.

Fixes: #56645

@nodejs-github-bot nodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. needs-ci PRs that need a full CI run. labels Feb 26, 2026
@juanarbol

Copy link
Copy Markdown
Member

That handle is gonna leak, and I don't think it's gonna fix anything.

This looks pretty much a AI-generated solution... that does actually nothing regarding your intention. 💔

@liuxingbaoyu

Copy link
Copy Markdown
Contributor Author

This is not an AI-generated solution, it's an inspiration I got from other code.

node/src/node_platform.cc

Lines 411 to 436 in a8eb690

void PerIsolatePlatformData::Shutdown() {
auto foreground_tasks_locked = foreground_tasks_.Lock();
auto foreground_delayed_tasks_locked = foreground_delayed_tasks_.Lock();
foreground_delayed_tasks_locked.PopAll();
foreground_tasks_locked.PopAll();
scheduled_delayed_tasks_.clear();
if (flush_tasks_ != nullptr) {
// Both destroying the scheduled_delayed_tasks_ lists and closing
// flush_tasks_ handle add tasks to the event loop. We keep a count of all
// non-closed handles, and when that reaches zero, we inform any shutdown
// callbacks that the platform is done as far as this Isolate is concerned.
self_reference_ = shared_from_this();
uv_close(reinterpret_cast<uv_handle_t*>(flush_tasks_),
[](uv_handle_t* handle) {
std::unique_ptr<uv_async_t> flush_tasks{
reinterpret_cast<uv_async_t*>(handle)};
PerIsolatePlatformData* platform_data =
static_cast<PerIsolatePlatformData*>(flush_tasks->data);
platform_data->DecreaseHandleCount();
platform_data->self_reference_.reset();
});
flush_tasks_ = nullptr;
}
}

@codecov

codecov Bot commented Feb 26, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 66.66667% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 90.14%. Comparing base (00917ba) to head (712964b).
⚠️ Report is 45 commits behind head on main.

Files with missing lines Patch % Lines
src/node_platform.cc 66.66% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main   #61999   +/-   ##
=======================================
  Coverage   90.14%   90.14%           
=======================================
  Files         741      741           
  Lines      242076   242079    +3     
  Branches    45558    45548   -10     
=======================================
+ Hits       218216   218220    +4     
+ Misses      15385    15351   -34     
- Partials     8475     8508   +33     
Files with missing lines Coverage Δ
src/node_platform.cc 76.00% <66.66%> (-0.25%) ⬇️

... and 27 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@juanarbol

Copy link
Copy Markdown
Member

This is not an AI-generated solution, it's an inspiration I got from other code.

My bad... but sadly still... I don't think this is gonna fix the fundamental problem at all and still leaking.

Comment thread src/node_platform.cc Outdated
@liuxingbaoyu

Copy link
Copy Markdown
Contributor Author

@juanarbol I understand now. The AI ​​is telling me that the handle wasn't deleted. AI ​​is more familiar with C++ than I am. 🤦‍♂️

@addaleax addaleax added the review wanted PRs that need reviews. label Mar 2, 2026
Comment thread src/node_platform.cc Outdated
sanyasamineva0x added a commit to TrueConf/trueconf-openclaw-channel that referenced this pull request Apr 30, 2026
* fix(bin): work around libuv async assertion on Windows exit

trueconf-setup crashes at the end of a successful run on Windows + Node
24.x with `assertion failed !(handle->flags & UV_HANDLE_CLOSING)` in
src/win/async.c. Root cause is the open Node issue nodejs/node#56645 —
Node calls `uv_async_send()` on a closing handle when `process.exit()`
short-circuits libuv teardown right after `fetch()`. PR
nodejs/node#61999 has been open since Feb 2026 with no backport.

Two cooperating workarounds, both documented in the upstream thread:

- src/probe.mjs: validateOAuthCredentials now always owns its undici
  Agent and closes it in finally, so no keep-alive sockets dangle into
  loop teardown. Cleanup is best-effort — errors are swallowed so the
  OAuth result classification stays unaffected.

- bin/trueconf-setup.mjs: CLI entry sets `process.exitCode` instead of
  calling `process.exit()`, letting the loop drain naturally after the
  dispatcher and clack readline release their handles. Shell exit
  contract is unchanged.

Tests:
- probe.test.mjs: assert dispatcher.close() runs on the success path
  and on the fetch-throws path.
- bin-cli-subprocess-exits.test.ts: spawn the CLI as a real subprocess
  and assert it exits within an 8s budget on success (0) and OAuth
  failure (1) — catches loop-hang regressions on any platform.

970 tests | 2 skipped on macOS, tsc clean, oxlint clean. Windows UAT
pending.

* fix(bin): watchdog + tighter exit-budget test on review feedback

Two review findings on the prior libuv-assertion commit:

- bin/trueconf-setup.mjs: a future regression that leaks an event-loop
  handle (clack stdin in raw mode, sharp libvips worker, an unref-missed
  timer) would now silently freeze the wizard's terminal forever instead
  of crashing. Add a 10-second .unref()'d watchdog that prints a clear
  diagnostic to stderr and forces exit, so a leak is loud, not silent.
  The timer self-defeats on the happy path because .unref() lets the
  loop drain ahead of it.

- tests/integration/bin-cli-subprocess-exits.test.ts: the prior version
  had three weaknesses. (1) The CLI entry block does not parse
  --config from argv, so passing `--config /tmp/x.json` was silently
  ignored and the success test wrote a fake-server config into the
  developer's real ~/.openclaw/openclaw.json. Sandbox via `HOME` and
  `USERPROFILE` env vars instead — that's the only knob the wizard's
  default `homedir()` lookup reads. (2) The 8s budget was too lax: a
  partial leak (5s timer ref) would slip under the kill timer
  unnoticed. Assert elapsedMs < 3000 explicitly so partial regressions
  fail loud. (3) Hard-coded port `1` for the failure path can SYN-drop
  on CI firewalls and time out, masking a real loop-hang as a flake.
  Reserve a closed loopback port via listen(0) → close instead — that
  reliably ECONNREFUSEs.

970 tests | 2 skipped on macOS, tsc clean, oxlint clean. Windows UAT
still pending.
dcristoloveanu added a commit to Azure/c-build-tools that referenced this pull request May 15, 2026
Node 24 task-host wrappers on Windows ADO agents intermittently abort with
Exit code 57005 (Watson bucket FAIL_FAST_FATAL_APP_EXIT_c0000409 in
vss-agent\externals\node24\bin\node.exe). Symbolicated stacks point at a
libuv UV_HANDLE_CLOSING race in uv_async_send() called from Node's
WorkerThreadsTaskRunner::DelayedTaskScheduler at shutdown:

    Assertion failed: !(handle->flags & UV_HANDLE_CLOSING)
    file deps/uv/src/win/async.c, line 76

Tracked upstream as nodejs/node#56645 (open; pending fix PR nodejs/node#61999)
and in the agent as microsoft/azure-pipelines-agent#5498. Until either fix
ships and the agent's externals/node24 picks it up, the only mitigation
available to consumers is to retry the affected setup tasks.

retryCountOnTaskFailure: 3 brings the residual per-task failure rate from
~9% (observed) to <0.01%. Both NuGetAuthenticate@1 and NuGetToolInstaller@1
are idempotent setup, so retrying on any failure is safe; legitimate
failures still surface after the retries are exhausted.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
mickey-mikey added a commit to mickey-mikey/ai-inference that referenced this pull request May 24, 2026
…rash

On Windows, the explicit process.exit() calls in run() abort with
  Assertion failed: !(handle->flags & UV_HANDLE_CLOSING),
  file src\win\async.c, line 76
when the openai SDK's undici-based HTTP/2 connection pool is still
tearing down the TLS socket to models.github.ai. This is the upstream
Node bug tracked at nodejs/node#56645 — Node calls uv_async_send() on
an async handle after uv_close(), which libuv asserts against. The
upstream fix (nodejs/node#61999) has been stalled in review since
January 2025, and no released Node version contains it yet.

Reproduces 100% of the time against models.github.ai on Windows Node 24
with the openai SDK; passes 100% with a brief setTimeout before exit.
Same workaround already shipped by astral-sh/setup-uv (#880, 100ms) and
silverwind/updates (actions#138, 200ms).

Extract a `safeExit(code)` helper that yields for 100ms on Windows only
before calling process.exit; Linux and macOS take the original code
path with no added latency.

Refs:
- nodejs/node#56645
- astral-sh/setup-uv#880
- silverwind/updates#138
mickey-mikey added a commit to mickey-mikey/ai-inference that referenced this pull request May 24, 2026
…rash

On Windows, the explicit process.exit() calls in run() abort with
  Assertion failed: !(handle->flags & UV_HANDLE_CLOSING),
  file src\win\async.c, line 76
when the openai SDK's undici-based HTTP/2 connection pool is still
tearing down the TLS socket to models.github.ai. This is the upstream
Node bug tracked at nodejs/node#56645 — Node calls uv_async_send() on
an async handle after uv_close(), which libuv asserts against. The
upstream fix (nodejs/node#61999) has been stalled in review since
January 2025, and no released Node version contains it yet.

Reproduces 100% of the time against models.github.ai on Windows Node 24
with the openai SDK; passes 100% with a brief setTimeout before exit.
Same workaround already shipped by astral-sh/setup-uv (#880, 100ms) and
silverwind/updates (actions#138, 200ms).

Extract a `safeExit(code)` helper that yields for 100ms on Windows only
before calling process.exit; Linux and macOS take the original code
path with no added latency.

Refs:
- nodejs/node#56645
- astral-sh/setup-uv#880
- silverwind/updates#138
DecimalTurn added a commit to vbapm/core that referenced this pull request Jun 5, 2026
Workaround for libuv UV_HANDLE_CLOSING assertion failure in child_process.exec on Windows with Node.js v23+ (nodejs/node#56645). The race condition occurs at shutdown when Node calls uv_async_send() after uv_close(), causing a hard crash in src\win\async.c.

Replaces promisified exec() with a spawn-based execSpawn() on Windows that avoids the problematic pipe-closing path. macOS and other platforms continue to use the original exec().

TODO: Remove execSpawn once the upstream fix (nodejs/node#61999) is merged and released.
@MikeMcC399

This comment was marked as resolved.

@liuxingbaoyu

Copy link
Copy Markdown
Contributor Author

Thanks for the reminder!
Sorry, I forgot about that, I'll rebase.

Ignore `PostDelayedTask` after `Stop`
to avoid assertions.

Fixes: nodejs#56645
Signed-off-by: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com>
@MikeMcC399 MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Jul 22, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399

MikeMcC399 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

@juanarbol @addaleax @santigimeno

Would you be able to review this PR again? Changes based on the feedback earlier this year were made.

The original issue #56645 remains currently unfixed. Whether it occurs or not seems to depend on timing and the system it runs on (see nodejs/corepack#715 (comment)).

cc: @nodejs/platform-windows @nodejs/libuv

@github-actions github-actions Bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 23, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399 MikeMcC399 added the author ready PRs that have at least one approval, no pending requests for changes, and a CI started. label Jul 24, 2026
@avivkeller avivkeller added the commit-queue Add this label to land a pull request using GitHub Actions. label Jul 24, 2026
@MikeMcC399 MikeMcC399 removed the review wanted PRs that need reviews. label Jul 24, 2026
@nodejs-github-bot nodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label Jul 24, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 0fae62c into nodejs:main Jul 24, 2026
84 of 86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 0fae62c

sh41 added a commit to sh41/intellij-elixir that referenced this pull request Jul 30, 2026
Workaround for nodejs/node#61999

```
Post job cleanup.
Setup Gradle
  Post job cleanup.
  In post-action step
  Cache is disabled: will not restore state from previous builds.
  Generating Job Summary
  Minimizing obsolete Job Summary comments on PR KronicDeth#3889.
  Completed post-action step
  Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c, line 94
```
@brianrob

brianrob commented Aug 2, 2026

Copy link
Copy Markdown

Requesting that this be ported to a v24.x LTS as we're seeing this issue when using v24.16.0.

aduh95 pushed a commit that referenced this pull request Aug 3, 2026
Ignore `PostDelayedTask` after `Stop`
to avoid assertions.

Fixes: #56645
Signed-off-by: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com>
PR-URL: #61999
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Reviewed-By: Aviv Keller <me@aviv.sh>
@MikeMcC399

Copy link
Copy Markdown
Contributor

Also needed in Node.js 26.x

Corepack CI continues to fail locally in both Node.js 24.19.0 & 26.6.0 - see nodejs/corepack#715

aduh95 pushed a commit that referenced this pull request Aug 4, 2026
Ignore `PostDelayedTask` after `Stop`
to avoid assertions.

Fixes: #56645
Signed-off-by: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com>
PR-URL: #61999
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Reviewed-By: Aviv Keller <me@aviv.sh>
aduh95 pushed a commit that referenced this pull request Aug 6, 2026
Ignore `PostDelayedTask` after `Stop`
to avoid assertions.

Fixes: #56645
Signed-off-by: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com>
PR-URL: #61999
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Reviewed-By: Aviv Keller <me@aviv.sh>
ndoschek pushed a commit to eclipse-theia/theia that referenced this pull request Aug 10, 2026
The `download:plugins` handler called `process.exit()` on both its success and
failure paths, as soon as `downloadPlugins` settled. On Windows that aborts the
process outright: Node calls `uv_async_send` on an already-closing handle while
undici tears down the sockets the OVSX requests ran on, libuv asserts, and the
process fast-fails.

    Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c, line 76

The process dies with exit code 3221226505 (0xC0000409) after every plugin has
been resolved and downloaded, so the work has succeeded and only the teardown
fails. It is a race, so it reproduces intermittently — in one downstream CI the
Windows packaging leg aborted on 4 of 6 runs, each time at the end of a
`download:plugins` that had just reported every plugin as already downloaded.

This is nodejs/node#56645, fixed upstream by nodejs/node#61999 but not present
in any released Node version yet. It affects Node 23 and later; the same
downstream job ran 36 Windows legs on Node 22 without a single abort.

Set `process.exitCode` and let the event loop drain instead, matching what the
`.fail()` handler in this file already does. The command still exits promptly:
on Node 24.15.0 a cold run downloading two plugins takes 4.5s and exits 0, and a
fully cached run exits in under a second, so the hard exit was not holding the
process open.

Signed-off-by: Dmitrij Rozdestvensky <dmitrij.rozdestvensky@juliahub.com>
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Aug 11, 2026
This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [node](https://nodejs.org) ([source](https://github.com/nodejs/node)) | tools | minor | `26.5.0` → `26.7.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>nodejs/node (node)</summary>

### [`v26.7.0`](https://github.com/nodejs/node/releases/tag/v26.7.0): 2026-08-05, Version 26.7.0 (Current), @&#8203;aduh95

[Compare Source](nodejs/node@v26.5.0...v26.7.0)

##### Notable Changes

- \[[`58717685a1`](nodejs/node@58717685a1)] - **(SEMVER-MINOR)** **crypto**: support loading private keys through STORE loaders (Filip Skokan) [#&#8203;63949](nodejs/node#63949)
- \[[`44b940ee8c`](nodejs/node@44b940ee8c)] - **crypto**: update root certificates to NSS 3.125 (Node.js GitHub Bot) [#&#8203;64746](nodejs/node#64746)
- \[[`c1e4f7365e`](nodejs/node@c1e4f7365e)] - **(SEMVER-MINOR)** **lib**: add perfetto support (Chengzhong Wu) [#&#8203;64565](nodejs/node#64565)
- \[[`11c2f9c642`](nodejs/node@11c2f9c642)] - **(SEMVER-MINOR)** **module**: implement `Symbol.dispose` in `ModuleHooks` (Remco Haszing) [#&#8203;63928](nodejs/node#63928)
- \[[`a646319f61`](nodejs/node@a646319f61)] - **(SEMVER-MINOR)** **test\_runner**: add support for `--test-coverage-include-all` (avivkeller) [#&#8203;64830](nodejs/node#64830)

##### Commits

- \[[`a2d3f891d3`](nodejs/node@a2d3f891d3)] - **async\_hooks**: use validateBoolean for trackPromises (Soul Lee) [#&#8203;64731](nodejs/node#64731)
- \[[`d7266cdd99`](nodejs/node@d7266cdd99)] - **benchmark**: fix calibrate-n option handling (Luan Muniz) [#&#8203;64146](nodejs/node#64146)
- \[[`2e64293e3f`](nodejs/node@2e64293e3f)] - **buffer**: use Clamp conversion in Blob slice (Donghoon Kang) [#&#8203;64739](nodejs/node#64739)
- \[[`5fda0958bd`](nodejs/node@5fda0958bd)] - **buffer**: validate copyArrayBuffer offsets against buffer length (Ilia Alshanetsky) [#&#8203;63904](nodejs/node#63904)
- \[[`5298db40f9`](nodejs/node@5298db40f9)] - **build**: run perfetto build and test on GHA (Chengzhong Wu) [#&#8203;64721](nodejs/node#64721)
- \[[`e3eac7cef9`](nodejs/node@e3eac7cef9)] - **build**: fix v8\_use\_perfetto source scraping (Chengzhong Wu) [#&#8203;64721](nodejs/node#64721)
- \[[`ab5f076d7f`](nodejs/node@ab5f076d7f)] - **build**: bump rustc requirement to >=1.86 (Renegade334) [#&#8203;64543](nodejs/node#64543)
- \[[`df608e061f`](nodejs/node@df608e061f)] - **(SEMVER-MINOR)** **build**: perfetto-sdk (Chengzhong Wu) [#&#8203;64565](nodejs/node#64565)
- \[[`74928adc46`](nodejs/node@74928adc46)] - **build,tools**: fix shared library cross-compile (Kirill Saied) [#&#8203;63963](nodejs/node#63963)
- \[[`58717685a1`](nodejs/node@58717685a1)] - **(SEMVER-MINOR)** **crypto**: support loading private keys through STORE loaders (Filip Skokan) [#&#8203;63949](nodejs/node#63949)
- \[[`58d13b6f3d`](nodejs/node@58d13b6f3d)] - **crypto**: preserve OpenSSL errors from KDF failures (Filip Skokan) [#&#8203;64776](nodejs/node#64776)
- \[[`478a719cb5`](nodejs/node@478a719cb5)] - **crypto**: fix Argon2 bypassing FIPS mode (Filip Skokan) [#&#8203;64776](nodejs/node#64776)
- \[[`44b940ee8c`](nodejs/node@44b940ee8c)] - **crypto**: update root certificates to NSS 3.125 (Node.js GitHub Bot) [#&#8203;64746](nodejs/node#64746)
- \[[`fde85237c7`](nodejs/node@fde85237c7)] - **crypto**: clarify missing cipher error (Filip Skokan) [#&#8203;64852](nodejs/node#64852)
- \[[`c604d8846d`](nodejs/node@c604d8846d)] - **crypto**: reuse X509 issuer result (Filip Skokan) [#&#8203;64852](nodejs/node#64852)
- \[[`c68c7d0112`](nodejs/node@c68c7d0112)] - **crypto**: validate key generation options (Filip Skokan) [#&#8203;64852](nodejs/node#64852)
- \[[`c36bb1d017`](nodejs/node@c36bb1d017)] - **crypto**: fix Argon2 validation errors (Filip Skokan) [#&#8203;64852](nodejs/node#64852)
- \[[`f61408bb27`](nodejs/node@f61408bb27)] - **crypto**: handle XOF output allocation failure (Filip Skokan) [#&#8203;64851](nodejs/node#64851)
- \[[`2b4053d046`](nodejs/node@2b4053d046)] - **crypto**: initialize KeyObjectData mutex eagerly (Filip Skokan) [#&#8203;64851](nodejs/node#64851)
- \[[`4b7b2adf44`](nodejs/node@4b7b2adf44)] - **crypto**: handle DH operation failures (Filip Skokan) [#&#8203;64851](nodejs/node#64851)
- \[[`12170c3753`](nodejs/node@12170c3753)] - **crypto**: use user-facing error for output encoding changes (Archkon) [#&#8203;64692](nodejs/node#64692)
- \[[`474f06d550`](nodejs/node@474f06d550)] - **debugger**: preserve overlapping CDP request state (Trivikram Kamat) [#&#8203;64467](nodejs/node#64467)
- \[[`718cbe9497`](nodejs/node@718cbe9497)] - **deps**: upgrade npm to 11.19.0 (npm team) [#&#8203;64883](nodejs/node#64883)
- \[[`657c6154b3`](nodejs/node@657c6154b3)] - **deps**: update ngtcp2 to 1.25.0 (Node.js GitHub Bot) [#&#8203;64944](nodejs/node#64944)
- \[[`75a1fbeff9`](nodejs/node@75a1fbeff9)] - **deps**: update nghttp3 to 1.18.0 (Node.js GitHub Bot) [#&#8203;64943](nodejs/node#64943)
- \[[`07d7cb7cd8`](nodejs/node@07d7cb7cd8)] - **deps**: update minimatch to 10.2.6 (Node.js GitHub Bot) [#&#8203;64945](nodejs/node#64945)
- \[[`f7d56359f1`](nodejs/node@f7d56359f1)] - **deps**: update simdjson to 4.6.6 (Node.js GitHub Bot) [#&#8203;64942](nodejs/node#64942)
- \[[`8b06457cfb`](nodejs/node@8b06457cfb)] - **deps**: update acorn to 8.18.0 (Node.js GitHub Bot) [#&#8203;64941](nodejs/node#64941)
- \[[`5919d01525`](nodejs/node@5919d01525)] - **deps**: update googletest to [`1b6f64d`](nodejs/node@1b6f64d) (Node.js GitHub Bot) [#&#8203;64940](nodejs/node#64940)
- \[[`4a87ad6cff`](nodejs/node@4a87ad6cff)] - **deps**: update nghttp2 to 1.70.0 (Node.js GitHub Bot) [#&#8203;64939](nodejs/node#64939)
- \[[`c96d76a7c8`](nodejs/node@c96d76a7c8)] - **deps**: update zlib to 1.3.2.1-motley-42c2f19 (Node.js GitHub Bot) [#&#8203;64744](nodejs/node#64744)
- \[[`2b59984c0f`](nodejs/node@2b59984c0f)] - **deps**: V8: backport [`5177b10`](nodejs/node@5177b10891e6) (avivkeller) [#&#8203;64631](nodejs/node#64631)
- \[[`b839af91da`](nodejs/node@b839af91da)] - **deps**: update ada to 4.0.0 (Node.js GitHub Bot) [#&#8203;64790](nodejs/node#64790)
- \[[`70dedef942`](nodejs/node@70dedef942)] - **deps**: update sqlite to 3.53.4 (Node.js GitHub Bot) [#&#8203;64745](nodejs/node#64745)
- \[[`7bc4c171f5`](nodejs/node@7bc4c171f5)] - **deps**: update Rust crates for V8 14.6.202.34-node.26 (Renegade334) [#&#8203;64543](nodejs/node#64543)
- \[[`308c6b2ac3`](nodejs/node@308c6b2ac3)] - **deps**: V8: backport [`7d9b7e0`](nodejs/node@7d9b7e03141d) (Manish Goregaokar) [#&#8203;64543](nodejs/node#64543)
- \[[`8eeae28e88`](nodejs/node@8eeae28e88)] - **deps**: V8: backport [`c4d06ba`](nodejs/node@c4d06ba586f3) (liujiahui) [#&#8203;63731](nodejs/node#63731)
- \[[`bbd6fc58c4`](nodejs/node@bbd6fc58c4)] - **diagnostics\_channel**: grow native channel storage (Stephen Belanger) [#&#8203;64497](nodejs/node#64497)
- \[[`ce8b292955`](nodejs/node@ce8b292955)] - **doc**: fix grammar and punctuation in dgram documentation (Kamal Rawal) [#&#8203;64957](nodejs/node#64957)
- \[[`1a413a60cf`](nodejs/node@1a413a60cf)] - **doc**: fix grammar and editorial issues in addons documentation (Kamal Rawal) [#&#8203;64952](nodejs/node#64952)
- \[[`63fbd59e64`](nodejs/node@63fbd59e64)] - **doc**: formalize fn/name as part of TestOptions API (Christopher Hiller) [#&#8203;64946](nodejs/node#64946)
- \[[`b263b0bca1`](nodejs/node@b263b0bca1)] - **doc**: remove references to `ca`/`crl` as per-context QuicSession options (René) [#&#8203;64769](nodejs/node#64769)
- \[[`f37de14b27`](nodejs/node@f37de14b27)] - **doc**: fix typo in maintaining-dependencies.md (greenhead) [#&#8203;64896](nodejs/node#64896)
- \[[`16cb77cdc8`](nodejs/node@16cb77cdc8)] - **doc**: add RafaelGSS as last security release stewards (Rafael Gonzaga) [#&#8203;64843](nodejs/node#64843)
- \[[`335c28cd17`](nodejs/node@335c28cd17)] - **doc**: fix typos in documentation (greenhead) [#&#8203;64900](nodejs/node#64900)
- \[[`d4bed8ca39`](nodejs/node@d4bed8ca39)] - **doc**: fix missing references in doc type map (Tim Perry) [#&#8203;64872](nodejs/node#64872)
- \[[`e71d09d5f1`](nodejs/node@e71d09d5f1)] - **doc**: improve TestContext hook descriptions (Kamal Rawal) [#&#8203;64899](nodejs/node#64899)
- \[[`7089bd9ae4`](nodejs/node@7089bd9ae4)] - **doc**: add missing float32/float64 FFI type names (Soul Lee) [#&#8203;64874](nodejs/node#64874)
- \[[`8d3ae0830e`](nodejs/node@8d3ae0830e)] - **doc**: document stream.isDestroyed() (YspritanHyzygy) [#&#8203;64789](nodejs/node#64789)
- \[[`a757e62af7`](nodejs/node@a757e62af7)] - **doc**: add contributing detail for git Signed-off-by trailer (Mike McCready) [#&#8203;64862](nodejs/node#64862)
- \[[`3e840f43ed`](nodejs/node@3e840f43ed)] - **doc**: mark config-file as release candidate (Marco Ippolito) [#&#8203;64516](nodejs/node#64516)
- \[[`70cd5df810`](nodejs/node@70cd5df810)] - **doc**: fix duplicated word in test snapshot docs (Kamal Rawal) [#&#8203;64837](nodejs/node#64837)
- \[[`d5f36c7adc`](nodejs/node@d5f36c7adc)] - **doc**: remove obsolete cctest node.gyp instructions (Soul Lee) [#&#8203;64814](nodejs/node#64814)
- \[[`a0bf29ea09`](nodejs/node@a0bf29ea09)] - **doc**: report proper return type on url.format (Brian Muenzenmeyer) [#&#8203;64806](nodejs/node#64806)
- \[[`e655e42085`](nodejs/node@e655e42085)] - **doc**: use ffi.suffix for library paths in examples (Junsoo Ha) [#&#8203;64805](nodejs/node#64805)
- \[[`e0f0830dbc`](nodejs/node@e0f0830dbc)] - **doc**: document --permission-audit audit mode behavior (Adrián Estrada) [#&#8203;64791](nodejs/node#64791)
- \[[`efbede6de0`](nodejs/node@efbede6de0)] - **doc**: clarify tlsSocket.authorized on resumption (soreavis) [#&#8203;64584](nodejs/node#64584)
- \[[`db95655c4a`](nodejs/node@db95655c4a)] - **doc**: stabilize --disable-warning (Jean Michelet) [#&#8203;64742](nodejs/node#64742)
- \[[`a8367200be`](nodejs/node@a8367200be)] - **doc**: add MDN links for explicit resource management in fs (lluisemper) [#&#8203;59557](nodejs/node#59557)
- \[[`1c09165c2e`](nodejs/node@1c09165c2e)] - **doc**: mention constructor check in deepStrictEqual (Sumit Kumar Das) [#&#8203;62010](nodejs/node#62010)
- \[[`29709324e0`](nodejs/node@29709324e0)] - **doc**: update technical priorities (Jacob Smith) [#&#8203;64505](nodejs/node#64505)
- \[[`522a28e648`](nodejs/node@522a28e648)] - **doc**: deprecation add more codemod (Augustin Mauroy) [#&#8203;63175](nodejs/node#63175)
- \[[`c40aaa6539`](nodejs/node@c40aaa6539)] - **doc**: run license-builder (Node.js GitHub Bot) [#&#8203;63918](nodejs/node#63918)
- \[[`428e9bc50f`](nodejs/node@428e9bc50f)] - **ffi**: fix crash in refCallback and unrefCallback (Trivikram Kamat) [#&#8203;64881](nodejs/node#64881)
- \[[`33912103e7`](nodejs/node@33912103e7)] - **ffi**: reject fast calls after library close (Trivikram Kamat) [#&#8203;64860](nodejs/node#64860)
- \[[`b348ed7f92`](nodejs/node@b348ed7f92)] - **ffi**: validate fast 32-bit integer argument ranges (Trivikram Kamat) [#&#8203;64691](nodejs/node#64691)
- \[[`48f4cfb480`](nodejs/node@48f4cfb480)] - **ffi**: fix optimized buffer conversions (Trivikram Kamat) [#&#8203;64639](nodejs/node#64639)
- \[[`109ffcd4f3`](nodejs/node@109ffcd4f3)] - **ffi**: preserve link register in ppc64 trampoline (Trivikram Kamat) [#&#8203;64792](nodejs/node#64792)
- \[[`aa3f168b31`](nodejs/node@aa3f168b31)] - **ffi**: preserve strings during reentrant calls (Trivikram Kamat) [#&#8203;64551](nodejs/node#64551)
- \[[`ca60942f38`](nodejs/node@ca60942f38)] - **ffi**: preserve uint8 semantics for bool fast calls (Trivikram Kamat) [#&#8203;64527](nodejs/node#64527)
- \[[`0fb1d2bd65`](nodejs/node@0fb1d2bd65)] - **ffi**: validate fast integer argument ranges (Trivikram Kamat) [#&#8203;64614](nodejs/node#64614)
- \[[`b250b40b30`](nodejs/node@b250b40b30)] - **fs**: key glob matcher cache by platform (Archkon) [#&#8203;64571](nodejs/node#64571)
- \[[`e26891ec6a`](nodejs/node@e26891ec6a)] - **http**: fix writableFinished and 'finish' after write errors (Tim Perry) [#&#8203;64847](nodejs/node#64847)
- \[[`dfc192fdfb`](nodejs/node@dfc192fdfb)] - **http**: avoid aborting IncomingMessage signal on normal close (Archkon) [#&#8203;64392](nodejs/node#64392)
- \[[`6794441c85`](nodejs/node@6794441c85)] - **http**: guard invalid timeout values in checkConnections (Efe Karasakal) [#&#8203;64506](nodejs/node#64506)
- \[[`6879aa4aa8`](nodejs/node@6879aa4aa8)] - **http**: propagate highWaterMark to ClientRequest OutgoingMessage (trivenay) [#&#8203;64653](nodejs/node#64653)
- \[[`72448a82f4`](nodejs/node@72448a82f4)] - **http2**: avoid copying the options in respond() (Matteo Collina) [#&#8203;64265](nodejs/node#64265)
- \[[`f6692da576`](nodejs/node@f6692da576)] - **http2**: avoid per-write closures in kWriteGeneric (Matteo Collina) [#&#8203;64265](nodejs/node#64265)
- \[[`3ed37153f8`](nodejs/node@3ed37153f8)] - **http2**: reduce per-request allocations (Matteo Collina) [#&#8203;64265](nodejs/node#64265)
- \[[`bce92debba`](nodejs/node@bce92debba)] - ***Revert*** "**http2**: avoid per-write closures in kWriteGeneric" (Antoine du Hamel) [#&#8203;64663](nodejs/node#64663)
- \[[`b5d5dd74a1`](nodejs/node@b5d5dd74a1)] - ***Revert*** "**http2**: avoid copying the options in respond()" (Antoine du Hamel) [#&#8203;64663](nodejs/node#64663)
- \[[`19b9c14d60`](nodejs/node@19b9c14d60)] - **lib**: fix AbortSignal.any() observed-composite leak (Paul Bouchon) [#&#8203;64481](nodejs/node#64481)
- \[[`d3cada57c2`](nodejs/node@d3cada57c2)] - **lib**: fix typo in comment in \_http\_client.js (agape1225) [#&#8203;64729](nodejs/node#64729)
- \[[`c1e4f7365e`](nodejs/node@c1e4f7365e)] - **(SEMVER-MINOR)** **lib**: add perfetto support (Chengzhong Wu) [#&#8203;64565](nodejs/node#64565)
- \[[`6c2157522d`](nodejs/node@6c2157522d)] - **loader**: enforce path normalization before lookup (Maël Nison) [#&#8203;63917](nodejs/node#63917)
- \[[`31522c41a7`](nodejs/node@31522c41a7)] - **meta**: bump actions/stale from 10.3.0 to 11.0.0 (dependabot\[bot]) [#&#8203;64935](nodejs/node#64935)
- \[[`88c8b8ef54`](nodejs/node@88c8b8ef54)] - **meta**: bump github/codeql-action/analyze from 4.36.2 to 4.37.3 (dependabot\[bot]) [#&#8203;64934](nodejs/node#64934)
- \[[`9dcd759a84`](nodejs/node@9dcd759a84)] - **meta**: bump github/codeql-action/autobuild from 4.36.2 to 4.37.3 (dependabot\[bot]) [#&#8203;64933](nodejs/node#64933)
- \[[`82ca02db3c`](nodejs/node@82ca02db3c)] - **meta**: bump actions/setup-python from 6.3.0 to 7.0.0 (dependabot\[bot]) [#&#8203;64932](nodejs/node#64932)
- \[[`848e2287f2`](nodejs/node@848e2287f2)] - **meta**: bump github/codeql-action/init from 4.36.2 to 4.37.3 (dependabot\[bot]) [#&#8203;64931](nodejs/node#64931)
- \[[`ae8ad3b17b`](nodejs/node@ae8ad3b17b)] - **meta**: bump Mozilla-Actions/sccache-action from 0.0.10 to 0.0.11 (dependabot\[bot]) [#&#8203;64930](nodejs/node#64930)
- \[[`0b359cfa4c`](nodejs/node@0b359cfa4c)] - **meta**: bump cachix/install-nix-action from 31.10.6 to 31.11.0 (dependabot\[bot]) [#&#8203;64929](nodejs/node#64929)
- \[[`3b4f980f4c`](nodejs/node@3b4f980f4c)] - **meta**: bump github/codeql-action/upload-sarif from 4.36.2 to 4.37.3 (dependabot\[bot]) [#&#8203;64927](nodejs/node#64927)
- \[[`d7ee9e9ea7`](nodejs/node@d7ee9e9ea7)] - **meta**: bump step-security/harden-runner from 2.19.4 to 2.20.0 (dependabot\[bot]) [#&#8203;64926](nodejs/node#64926)
- \[[`7e80bbaaa9`](nodejs/node@7e80bbaaa9)] - **meta**: bump ossf/scorecard-action from 2.4.3 to 2.4.4 (dependabot\[bot]) [#&#8203;64925](nodejs/node#64925)
- \[[`915cabbfcf`](nodejs/node@915cabbfcf)] - **meta**: remove node\_crates .gitignore (René) [#&#8203;64779](nodejs/node#64779)
- \[[`8e03c54347`](nodejs/node@8e03c54347)] - **meta**: add [@&#8203;nodejs/url](https://github.com/nodejs/url) as codeowner for node\_url\_pattern.\* (Efe Karasakal) [#&#8203;64737](nodejs/node#64737)
- \[[`11c2f9c642`](nodejs/node@11c2f9c642)] - **(SEMVER-MINOR)** **module**: implement Symbol.dispose in ModuleHooks (Remco Haszing) [#&#8203;63928](nodejs/node#63928)
- \[[`fffd8a76d0`](nodejs/node@fffd8a76d0)] - **net**: support TCP handle transfer on Windows (Matteo Collina) [#&#8203;64460](nodejs/node#64460)
- \[[`fe9e0dbdc2`](nodejs/node@fe9e0dbdc2)] - **net**: support AF\_UNIX paths in net.BoundSocket (Guy Bedford) [#&#8203;64399](nodejs/node#64399)
- \[[`eb61b7ee1e`](nodejs/node@eb61b7ee1e)] - **permission**: add unique warning codes (David Evans) [#&#8203;64414](nodejs/node#64414)
- \[[`999a928822`](nodejs/node@999a928822)] - **permission**: support v8.setHeapSnapshotNearHeapLimit (Ilyas Shabi) [#&#8203;64808](nodejs/node#64808)
- \[[`7de3d095b6`](nodejs/node@7de3d095b6)] - **quic**: fix stop sending behaviour & callback (Tim Perry) [#&#8203;64710](nodejs/node#64710)
- \[[`6289398bb2`](nodejs/node@6289398bb2)] - **quic**: fix coverage comment typo (Jungwon Sohn) [#&#8203;64486](nodejs/node#64486)
- \[[`01510dc759`](nodejs/node@01510dc759)] - **quic**: fix segfault after fragmented client hello (Tim Perry) [#&#8203;64720](nodejs/node#64720)
- \[[`dcc348af97`](nodejs/node@dcc348af97)] - **quic**: serialize stream reset code as string (한만욱) [#&#8203;64577](nodejs/node#64577)
- \[[`c25b8e3331`](nodejs/node@c25b8e3331)] - **readline**: reduce createInterface overhead (Matteo Collina) [#&#8203;64585](nodejs/node#64585)
- \[[`14e802d1cd`](nodejs/node@14e802d1cd)] - **sqlite**: invalidate sessions when closing database (Trivikram Kamat) [#&#8203;64783](nodejs/node#64783)
- \[[`279547b7da`](nodejs/node@279547b7da)] - **sqlite**: check database state before calling SQLite (Trivikram Kamat) [#&#8203;64812](nodejs/node#64812)
- \[[`bb86521a42`](nodejs/node@bb86521a42)] - **sqlite**: fix crash when a session outlives its database (Mohamed Sayed) [#&#8203;63797](nodejs/node#63797)
- \[[`870f4997e7`](nodejs/node@870f4997e7)] - **sqlite**: fix use-after-free in Exec() and ApplyChangeset() (Matteo Collina) [#&#8203;64535](nodejs/node#64535)
- \[[`a8ec5a9df7`](nodejs/node@a8ec5a9df7)] - **src**: fix perfetto build on GetTraceFilePath (Chengzhong Wu) [#&#8203;64721](nodejs/node#64721)
- \[[`6cd643acaa`](nodejs/node@6cd643acaa)] - **src**: implement MemoryRetainer protocol for ByteSource (Filip Skokan) [#&#8203;64660](nodejs/node#64660)
- \[[`8725e56928`](nodejs/node@8725e56928)] - **src**: fix crash when writing odd-length hex string via Writev (RajeshKumar11) [#&#8203;63658](nodejs/node#63658)
- \[[`e018f9a4a1`](nodejs/node@e018f9a4a1)] - **(SEMVER-MINOR)** **src**: add perfetto trace agent (Chengzhong Wu) [#&#8203;64565](nodejs/node#64565)
- \[[`0611d443ab`](nodejs/node@0611d443ab)] - **(SEMVER-MINOR)** **src**: rename legacy trace event headers (Chengzhong Wu) [#&#8203;64565](nodejs/node#64565)
- \[[`2897cc1d93`](nodejs/node@2897cc1d93)] - **(SEMVER-MINOR)** **src**: fix trace macro compatibility (Chengzhong Wu) [#&#8203;64565](nodejs/node#64565)
- \[[`d4d7172e10`](nodejs/node@d4d7172e10)] - **src**: avoid using ToLocalChecked in crypto\_hash (James M Snell) [#&#8203;64668](nodejs/node#64668)
- \[[`53b7d48b47`](nodejs/node@53b7d48b47)] - **src**: fix libuv assertion on windows (liuxingbaoyu) [#&#8203;61999](nodejs/node#61999)
- \[[`69d10ed021`](nodejs/node@69d10ed021)] - **src,test**: disable trace events tests when perfetto is enabled (Chengzhong Wu) [#&#8203;64721](nodejs/node#64721)
- \[[`1b0597b4ef`](nodejs/node@1b0597b4ef)] - **stream**: cut per-chunk allocations in pipeTo (Matteo Collina) [#&#8203;64890](nodejs/node#64890)
- \[[`2632d606bb`](nodejs/node@2632d606bb)] - **stream**: preserve push signal abort reason (Trivikram Kamat) [#&#8203;64798](nodejs/node#64798)
- \[[`d5358a75bc`](nodejs/node@d5358a75bc)] - **stream**: skip zero-byte broadcast writes (Trivikram Kamat) [#&#8203;64772](nodejs/node#64772)
- \[[`796c896fb4`](nodejs/node@796c896fb4)] - **stream**: honor AbortSignal in Writer.end() (Trivikram Kamat) [#&#8203;64727](nodejs/node#64727)
- \[[`ff12b8e22e`](nodejs/node@ff12b8e22e)] - **stream**: use validateString for consumer encoding (Jungwon Sohn) [#&#8203;64754](nodejs/node#64754)
- \[[`cfad2efb06`](nodejs/node@cfad2efb06)] - **stream**: use the ring buffer for pending BYOB pull-into descriptors (Matteo Collina) [#&#8203;64818](nodejs/node#64818)
- \[[`fe06bf56dc`](nodejs/node@fe06bf56dc)] - **stream**: fix uncatchable error closing half-open Duplex.toWeb() writable (Mohamed Sayed) [#&#8203;64161](nodejs/node#64161)
- \[[`f2919dbb83`](nodejs/node@f2919dbb83)] - **test**: unflake debugger and REPL tests (Matteo Collina) [#&#8203;64718](nodejs/node#64718)
- \[[`a1c29174e8`](nodejs/node@a1c29174e8)] - **test**: ensure assertions are reached on all tests (Antoine du Hamel) [#&#8203;64716](nodejs/node#64716)
- \[[`b9e596f8e5`](nodejs/node@b9e596f8e5)] - **test**: reuse ffi.suffix instead of reimplementing it (Seongeun Lee) [#&#8203;64840](nodejs/node#64840)
- \[[`c816918e14`](nodejs/node@c816918e14)] - **test**: remove test-repl-user-error-handler from flaky (avivkeller) [#&#8203;64631](nodejs/node#64631)
- \[[`9d2f10ec54`](nodejs/node@9d2f10ec54)] - **test**: update WPT for url to [`4832db4`](nodejs/node@4832db4761) (Node.js GitHub Bot) [#&#8203;64829](nodejs/node#64829)
- \[[`75b80d0b7b`](nodejs/node@75b80d0b7b)] - **test**: update WPT for url to [`b63305b`](nodejs/node@b63305b743) (Node.js GitHub Bot) [#&#8203;64790](nodejs/node#64790)
- \[[`9a139b3c86`](nodejs/node@9a139b3c86)] - **test**: cover worker throwing primitive values (varshitha) [#&#8203;64365](nodejs/node#64365)
- \[[`796acc8920`](nodejs/node@796acc8920)] - **test**: mark test-repl-user-error-handler as flaky (Aviv Keller) [#&#8203;64612](nodejs/node#64612)
- \[[`a646319f61`](nodejs/node@a646319f61)] - **(SEMVER-MINOR)** **test\_runner**: add support for --test-coverage-include-all (avivkeller) [#&#8203;64830](nodejs/node#64830)
- \[[`4368303e01`](nodejs/node@4368303e01)] - **test\_runner**: wait for filtered suite build (semimikoh) [#&#8203;64208](nodejs/node#64208)
- \[[`70d11241a3`](nodejs/node@70d11241a3)] - **test\_runner**: convert to uint during deserialization (Aviv Keller) [#&#8203;64706](nodejs/node#64706)
- \[[`cafe7bffcc`](nodejs/node@cafe7bffcc)] - **tls**: fix SNICallback certificate selection (Matteo Collina) [#&#8203;64700](nodejs/node#64700)
- \[[`9ee05ec40f`](nodejs/node@9ee05ec40f)] - **tools**: bump the eslint group in /tools/eslint with 4 updates (dependabot\[bot]) [#&#8203;64928](nodejs/node#64928)
- \[[`5f4b859932`](nodejs/node@5f4b859932)] - **tools**: bump brace-expansion from 5.0.7 to 5.0.9 in /tools/eslint (dependabot\[bot]) [#&#8203;64904](nodejs/node#64904)
- \[[`b5ced907b3`](nodejs/node@b5ced907b3)] - **tools**: use 'readonly' for EventSource global (Honey Tyagi) [#&#8203;64787](nodejs/node#64787)
- \[[`fd4460e34e`](nodejs/node@fd4460e34e)] - **typings**: add heap\_utils internalBinding types (Donghoon Kang) [#&#8203;64816](nodejs/node#64816)
- \[[`3bc0ee0492`](nodejs/node@3bc0ee0492)] - **typings**: remove isDataView from types binding (Archkon) [#&#8203;64738](nodejs/node#64738)
- \[[`236d7ca965`](nodejs/node@236d7ca965)] - **url**: create URLPattern result properties in WebIDL order (Archkon) [#&#8203;64733](nodejs/node#64733)
- \[[`3def577ab4`](nodejs/node@3def577ab4)] - **v8**: report minor mark-sweep in GCProfiler (Archkon) [#&#8203;64688](nodejs/node#64688)
- \[[`5293abff73`](nodejs/node@5293abff73)] - **vfs**: speed up recursive readdir test setup (Trivikram Kamat) [#&#8203;64813](nodejs/node#64813)
- \[[`4345185496`](nodejs/node@4345185496)] - **vfs**: make lchown update symlink metadata (Trivikram Kamat) [#&#8203;64573](nodejs/node#64573)
- \[[`b6ab546de5`](nodejs/node@b6ab546de5)] - **wasm**: register missing SetURL function (Archkon) [#&#8203;64679](nodejs/node#64679)
- \[[`f322870bd1`](nodejs/node@f322870bd1)] - **zlib**: validate pledgedSrcSize as a safe integer (Archkon) [#&#8203;64604](nodejs/node#64604)
- \[[`44042c20d4`](nodejs/node@44042c20d4)] - **zlib**: accept ArrayBuffer dictionary in Zstd (Ryuhei Shima) [#&#8203;64599](nodejs/node#64599)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODguMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
wellofspirit added a commit to wellofspirit/ClaudeUI that referenced this pull request Aug 16, 2026
… test teardowns

The vitest fork flake (worker fast-fail 0xC0000409 at exit) was root-caused
to an upstream libuv Windows race (nodejs/node#61999, fixed in node 26.7.0 —
the runtime half of the fix is the machine-level node switch). This is the
hygiene half: forks must exit with a quiet event loop regardless of runtime.

- RemoteServer.stop() returns a bounded promise: client sockets close(1001)
  then terminate() after a 250ms grace; a sweep closes the sockets ws-lib
  tracks that this.clients does not (pre-auth window, cap/throttle refusals)
  so wss.close()'s callback cannot wait on them; the wss promise carries its
  own 500ms fallback; closeAllConnections() bounds the HTTP listener. Every
  synchronous side effect still precedes the first await, so non-awaiting
  callers (remote:stop IPC, app quit) keep the old semantics.
- ws-test-client close() (and the two file-local RawClient copies) resolve
  on the socket's close with the same bounded terminate fallback.
- Every suite constructing RemoteServer awaits client closes and stop() in
  teardown; fake-timer teardowns switch to real timers before awaiting.
- Guards proven failing pre-fix: stop() alone must drain wss.clients
  (tracked.size 2->0), and a pre-auth socket must not hang it
  ('still pending' -> 'resolved' within 3s).
codebytere added a commit to electron/electron that referenced this pull request Aug 18, 2026
…down

Backports nodejs/node#61999.

NodePlatform's DelayedTaskScheduler closes its uv loop when the worker
thread task runner shuts down, but a task still running on a platform
worker thread (V8's MemoryPool release task re-posts itself with a
delay) could call PostDelayedTask() after that. The call reaches
uv_async_send() on a closed handle; on Windows libuv then fails
PostQueuedCompletionStatus() against the destroyed completion port and
calls uv_fatal_error(). Late posts are now dropped once the scheduler
has been stopped, matching what PerIsolatePlatformData already does for
foreground tasks.
codebytere added a commit to electron/electron that referenced this pull request Aug 19, 2026
…down (#52956)

Backports nodejs/node#61999.

NodePlatform's DelayedTaskScheduler closes its uv loop when the worker
thread task runner shuts down, but a task still running on a platform
worker thread (V8's MemoryPool release task re-posts itself with a
delay) could call PostDelayedTask() after that. The call reaches
uv_async_send() on a closed handle; on Windows libuv then fails
PostQueuedCompletionStatus() against the destroyed completion port and
calls uv_fatal_error(). Late posts are now dropped once the scheduler
has been stopped, matching what PerIsolatePlatformData already does for
foreground tasks.
MarshallOfSound pushed a commit to electron/electron that referenced this pull request Aug 19, 2026
…down (#53014)

* fix: crash on windows when v8 posts a delayed worker task during shutdown

Backports nodejs/node#61999.

NodePlatform's DelayedTaskScheduler closes its uv loop when the worker
thread task runner shuts down, but a task still running on a platform
worker thread (V8's MemoryPool release task re-posts itself with a
delay) could call PostDelayedTask() after that. The call reaches
uv_async_send() on a closed handle; on Windows libuv then fails
PostQueuedCompletionStatus() against the destroyed completion port and
calls uv_fatal_error(). Late posts are now dropped once the scheduler
has been stopped, matching what PerIsolatePlatformData already does for
foreground tasks.

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: regenerate the node patch against v24.18.1 as pinned here

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
MarshallOfSound pushed a commit to electron/electron that referenced this pull request Aug 19, 2026
…down (#53013)

* fix: crash on windows when v8 posts a delayed worker task during shutdown

Backports nodejs/node#61999.

NodePlatform's DelayedTaskScheduler closes its uv loop when the worker
thread task runner shuts down, but a task still running on a platform
worker thread (V8's MemoryPool release task re-posts itself with a
delay) could call PostDelayedTask() after that. The call reaches
uv_async_send() on a closed handle; on Windows libuv then fails
PostQueuedCompletionStatus() against the destroyed completion port and
calls uv_fatal_error(). Late posts are now dropped once the scheduler
has been stopped, matching what PerIsolatePlatformData already does for
foreground tasks.

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: regenerate the node patch against v24.18.1 as pinned here

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
mberrys added a commit to mberrys/ivory-tower that referenced this pull request Aug 20, 2026
* chore(task): add input variable and problem matcher task examples (eclipse-theia#17868)

Add examples for promptString and pickString input variables and for a custom problem matcher. Keep the existing task fixtures unchanged while demonstrating supported task configuration features.

Signed-off-by: Md. Mehedi Hasan <2105052@ugrad.cse.buet.ac.bd>

* fix(scm): enable pull/push toolbar actions in history graph (eclipse-theia#17876)

The git.pullRef and git.pushRef commands contributed by vscode.git gate
their enablement on the scmCurrentHistoryItemRefInFilter context key,
which Theia never set, so clicking the graph toolbar actions failed with
'no active handlers'. Register the key and set it while the graph has a
current history item ref (the graph has no ref filter yet, so the
current ref is always considered part of it).

Fixes item 1 of eclipse-theia#17457

* fix(cli): don't hard-exit `download:plugins` after fetching (eclipse-theia#17896)

The `download:plugins` handler called `process.exit()` on both its success and
failure paths, as soon as `downloadPlugins` settled. On Windows that aborts the
process outright: Node calls `uv_async_send` on an already-closing handle while
undici tears down the sockets the OVSX requests ran on, libuv asserts, and the
process fast-fails.

    Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c, line 76

The process dies with exit code 3221226505 (0xC0000409) after every plugin has
been resolved and downloaded, so the work has succeeded and only the teardown
fails. It is a race, so it reproduces intermittently — in one downstream CI the
Windows packaging leg aborted on 4 of 6 runs, each time at the end of a
`download:plugins` that had just reported every plugin as already downloaded.

This is nodejs/node#56645, fixed upstream by nodejs/node#61999 but not present
in any released Node version yet. It affects Node 23 and later; the same
downstream job ran 36 Windows legs on Node 22 without a single abort.

Set `process.exitCode` and let the event loop drain instead, matching what the
`.fail()` handler in this file already does. The command still exits promptly:
on Node 24.15.0 a cold run downloading two plugins takes 4.5s and exits 0, and a
fully cached run exits in under a second, so the hard exit was not holding the
process open.

Signed-off-by: Dmitrij Rozdestvensky <dmitrij.rozdestvensky@juliahub.com>

* fix(core): cancel superseded activation checks (eclipse-theia#17895)

Use matching window timeout APIs so a new activation check cancels the previous polling loop. Add focused regression coverage for the timer handle.

Signed-off-by: Alec Timison <alec.timison@gmail.com>

* feat(scm-extra): deprecate @theia/scm-extra (eclipse-theia#17882)

The SCM History view is superseded by the SCM history graph in @theia/scm
(branch history) and the Timeline view in @theia/timeline (per-file
history). It has also been non-functional in the default application since
the removal of @theia/git: nothing implements ScmHistorySupport anymore,
so the view only shows an error while its 'History' menu items and alt+h
keybinding remain visible.

- tag all exported APIs with @deprecated since 1.75.0 pointing to the replacements
- add a deprecation notice to the README and package description
- stop publishing the package on npm
- remove the package from the example applications
- drop ScmHistoryContribution from the api-tests menu spec
- add changelog entries, including the breaking deprecation

Addresses item 4 of eclipse-theia#17457

* ai-ide: add Memory prompt capability (eclipse-theia#17865)

Introduce a built-in "Memory" prompt capability that lets AI agents maintain a
persistent, wiki-style knowledge base under the metadata
store of the current workspace: machine-local, one memory per workspace,
never part of the user's repository,
compiling raw session output into linked concept articles for reuse across tasks.

It is contributed via MemoryCapabilityContribution, bound in the ai-ide frontend
module, and offered as an opt-in capability in the coder agent prompt template.

The path is generated, so `MemoryDirectoryVariableContribution`
exposes it as the `{{memoryDirectory}}` variable and contributes it as
an `AccessibleRootContribution`, a new contribution point for locations
Theia generates rather than the user configures. Memory thus needs no
tools of its own, so every path-taking tool — the write tools included,
which previously skipped the check — now goes through the single gate
`WorkspaceFunctionScope.resolveAccessiblePath`, and search returns
native paths for matches outside the workspace.

* chore(deps): NPM upgrade after 1.74.1 (eclipse-theia#17909)

- align dependency ranges with resolved versions in package-lock
- remove the unused less dependency, dead since font-awesome-webpack was dropped in 2021, which also drops image-size
- override tar, adm-zip, uuid, serialize-javascript, js-yaml and dompurify to patched versions
- scope the brace-expansion (nx) and @typescript-eslint/utils (eslint-plugin-tslint) overrides to the affected subtrees
- reduces npm audit

Contributed on behalf of STMicroelectronics

* monaco: fall back to the editor theme matching the theme type (eclipse-theia#17864)

Closes eclipse-theia/theia-ide#757

- fall back to the default editor theme matching the color theme's type
  instead of always `dark-theia`, so light themes no longer render on a
  dark base
- normalize shorthand hex (e.g. `#000`) in `normalizeColor` so themes like
  Alabaster apply instead of keeping the previous editor theme

* feat(scm): color history graph by ref roles and mark current commit

Mirror VS Code's scm graph color map: the current, remote, and base refs
color their rows, badges, and downstream first-parent chain with
historyItemRefColor / historyItemRemoteRefColor / historyItemBaseRefColor,
while unmapped lanes rotate through foreground1-5 instead of positional
lane colors. Diverged local and remote branches are now visually distinct.

The HEAD double-circle indicator is now keyed to the current history item
ref's revision instead of guessing row 0 / lane 0, and ref badges use the
provider-supplied icon (e.g. the target icon vscode.git sends for the
current branch) with category fallbacks.

Addresses item 2 of eclipse-theia#17457

* feat(scm): render the history graph hover supplied by the provider

Addresses item 6 of eclipse-theia#17457.

The graph derived its hover from the history item's fields, so the commit hash
only toggled the inline change list and the provider's own links never ran.
Providers already send the hover they want: vscode.git supplies the same
content as its git blame decoration, including the author `mailto:` link,
`git.viewCommit`, `git.copyContentToClipboard` and the remote commands such as
"Open on GitHub".

That content was being discarded - `historyItemFromDto` flattened it to
`tooltip.value`, dropping the `isTrusted` command allow-list without which
every command link is refused, and the array form providers use for multiple
sections. `ScmHistoryItem.tooltip` now carries `MarkdownString`s through.

The hover renders those sections when present and falls back to the derived one
otherwise. Sections are wired separately, so each authorizes only the commands
in its own `isTrusted`, and no separators are added on top of the ones the
provider already emits. Paragraph margins are reset to the spacing of the blame
hover rather than the browser default.

Two supporting fixes in @theia/core, both required by the above:

- the markdown renderer honors VS Code's `![alt](src|width=,height=)` image
  sizing syntax, used for the author avatar. markdown-it would otherwise fold
  the suffix into `src` and yield a broken image.
- markdown link wiring is idempotent. `MonacoMarkdownRenderer` delegates to
  VS Code's renderer, which activates links through its own opener service;
  wiring a handler on top of that output would open every link twice. Renderers
  that handle their own links declare it with `markMarkdownLinksWired`, so a
  caller can keep wiring unconditionally for the core renderer.

* feat(scm): history graph ref filter picker, refresh action, and scm.graph preferences (eclipse-theia#17881)

Addresses items 3 and 5 of eclipse-theia#17457

Add the missing native toolbar actions to the history graph (item 3 of
eclipse-theia#17457): a ref filter quick pick matching VS Code's
'Auto' dropdown and a refresh action. The picked refs feed
provideHistoryItems, ref role colors, badge visibility, and the
scmCurrentHistoryItemRefInFilter context key.

Implement the scm.graph preferences (item 5): 'scm.graph.badges',
'scm.graph.pageOnScroll', and 'scm.graph.pageSize'.

Apply the toggled state to menu-contributed toolbar items in @theia/core, so
the filter action reflects an active filter.

The repository picker and showIncomingChanges/showOutgoingChanges settings
are not included: Theia's SCM view has its own repositories section, and the
graph has no incoming/outgoing nodes yet.

* chore(electron): upgrade Electron from 42.3.0 to 42.8.1

- Electron 42.4.0 replaced `extract-zip` with `@electron-internal/extract-zip`, removing the postinstall stream race on Node 24
- drop the `yauzl` override, which only existed to force a fixed yauzl under `extract-zip`
- `decompress-unzip` is back on its declared yauzl 2.10.0, `@vscode/vsce` on 3.4.0
- regenerate the re-export READMEs and the lockfile

Resolves eclipse-theiaGH-17570

Contributed on behalf of STMicroelectronics

* ci: run Playwright workflows on Node 24 again

- playwright-core 1.62.1 bundles yauzl 3.4.0, which fixes the extract-zip stream race that forced the Node 22 pin
- keep the ms-playwright browser cache

Contributes to eclipse-theiaGH-17570

Contributed on behalf of STMicroelectronics

* feat(ai-chat): notify agents about external file changes (eclipse-theia#17863)

An agent that read a file was never told when the user, another agent or a
formatter changed it afterwards, so it kept reasoning about content that no
longer existed and the whole-file write tools overwrote it.

FileReadTracker records, per session, a hash of the content an agent was handed.
File system and editor events only flag tracked entries; content is compared
lazily where the state is needed, so a quiet workspace costs no IO. A file is
tracked before it is read, so an edit landing during the read is not overwritten
by the snapshot that read produces, and it is compared through
`FileService.read`, so that a file which is not UTF-8 is decoded the way the read
tools decode it. Comparing forgets a file only when it is gone; any other read
failure keeps it flagged instead of assuming an overwrite is safe.

Agents get a trailing message naming the changed files as
`<rootName>/<relativePath>`, or as a uri when the root name is ambiguous or the
file is outside every root, so that they can read them back and clear the flag.
The message repeats until they do, and the whole-file write tools refuse to
overwrite a file that changed since it was read. Targeted replacements need no
guard: they re-read at write time and fail when their matched content is gone.

Change set elements re-snapshot after applying, so an agent's own write, and any
code action or formatting on save that altered it, is not reported back as
external.

Closes eclipse-theia#17710

* feat: Implement VS Code walkthroughs contribution point (eclipse-theia#17309)

Enable extensions to contribute guided walkthroughs that appear on the
Welcome page, matching the VS Code contributes.walkthroughs API.

- parse walkthrough and step definitions from the extension `package.json`,
  and request their media and the extension icon from the backend
- manage state, step completion and persisted progress in a dedicated
  `WalkthroughService`
- evaluate the `when` clauses of walkthroughs and of steps, and re-evaluate
  them whenever the context changes
- support every completion event type: `onCommand`, `onContext`,
  `onSettingChanged`, `extensionInstalled`, `onView` and `onLink`
- keep the walkthroughs of uninstalled extensions, and of extensions that
  workspace trust keeps from loading, out of the list
- list the available walkthroughs as cards with progress, and give a
  selected one the whole view, with the widget named after it
- render step descriptions and markdown media as trusted markdown so that
  their command links work, and pick the image variant of the active theme
- toggle step completion from the step indicator, or complete every step of
  a walkthrough at once
- offer the available walkthroughs for selection when one is opened or reset
  through a command
- add `registerAlias` to `CommandRegistry` and register 17 aliases, so that
  `onCommand` completion and plugin activation events fire for the VS Code
  command ids as well
- contribute the `workbench.welcomePage.walkthroughs.openOnInstall`
  preference, three commands and five color tokens

`featuredFor` and the `onWalkthroughSelected` activation event are not
implemented yet.

Fixes eclipse-theia#13879

Co-authored-by: Nina Doschek <ndoschek@eclipsesource.com>

* perf(ai-core): avoid blocking startup for skill scan (eclipse-theia#17843)

* perf(preferences): defer PreferencesWidget construction until needed (eclipse-theia#17877)

* feat(ai-registry): auto-update installed skills and MCP servers

Check the registry once per window load and apply or offer updates
following a User-scoped default preference with per-artifact overrides.
Overrides are set from a new gear context menu on the skill and MCP
entry cards, which also marks whether the effective mode is inherited
from the default or set for that artifact.

* fix(vsx-registry, ai-registry): keep counter badges when the registry is unreachable

The Extensions view only assigned section badges from a source change event,
which the source fires while the widget is still being constructed. Online a
later event always arrived (the registry fetch firing onDidChange), but offline
that fetch fails silently and the badges stayed unset for Installed and
Built-in. Derive the badge from the tree instead, which resolves its children
when the source is assigned.

Also bound the registry fetch: a 10s deadline, one shared in-flight request,
and a backoff window after a failure, so a network that drops packets cannot
keep sections unresolved. Contributions of a section now resolve concurrently
and in isolation, so one that is slow or rejects no longer delays or empties
the entries of the others.

* feat(browser-only): Prepare plugins at build time via @theia/plugin-utils (eclipse-theia#17758)

- Add @theia/plugin-utils package with shared plugin manifest, contribution,
  and activation-event normalization logic
- Move normalization out of plugin-ext scanners into plugin-utils so it can run
  at build time as well as at runtime
- Prepare and normalize plugins at build time for browser-only apps via
  application-manager, writing a browser-only extensions list
- Normalize walkthroughs (media and icon URLs) for browser-only static hosting
- Resolve grammar, media, and icon paths through plugin-relative URL hooks

* feat(ai-ide): reference open editors in Architect, Coder and Universal system prompts (eclipse-theia#17755)

- add an open-editors hint fragment to the Architect, Coder and Universal
  system prompts so the agents are aware of the user's open editors
- register the fragment via OpenEditorsHintContribution

Closes eclipse-theia#17326

* fix: hoist esbuild polyfill plugin for Ivory Tower browser build

Upstream application-manager generates gen-esbuild.browser.mjs that
imports esbuild-plugins-node-modules-polyfill at bundle time. After the
lockfile regeneration it was nested under application-manager only, so
verify:ivory-tower build:ivory-tower failed with ERR_MODULE_NOT_FOUND.

Add the package as a root devDependency so npm ci hoists it to
node_modules where the generated esbuild script can resolve it.

Co-authored-by: michael berry <mberrys@users.noreply.github.com>

* fix: hoist @electron/rebuild for Windows electron-rebuild step

The upstream sync lockfile nested @electron/rebuild under
application-manager only. rebuild.ts invokes `npx --no-install
electron-rebuild` from examples/electron, which requires the binary at
the workspace root — stable had it hoisted, the regenerated lockfile did
not.

On Windows CI this caused electron-rebuild to fail silently after
backing up native modules, revert them, and fail build:electron — even
though verify:ivory-tower had already passed.

Add @electron/rebuild as a root devDependency and restore Linux libc
metadata stripped by npm install.

Co-authored-by: michael berry <mberrys@users.noreply.github.com>

---------

Signed-off-by: Md. Mehedi Hasan <2105052@ugrad.cse.buet.ac.bd>
Signed-off-by: Dmitrij Rozdestvensky <dmitrij.rozdestvensky@juliahub.com>
Signed-off-by: Alec Timison <alec.timison@gmail.com>
Co-authored-by: Md. Mehedi Hasan <121800950+mehedi-107@users.noreply.github.com>
Co-authored-by: safisa <safi@k2view.com>
Co-authored-by: Dmitrij Rozdestvensky <124160656+dr14-make@users.noreply.github.com>
Co-authored-by: aliouswe <alec.timison@gmail.com>
Co-authored-by: Eugen Neufeld <eneufeld@eclipsesource.com>
Co-authored-by: Nina Doschek <ndoschek@eclipsesource.com>
Co-authored-by: Ehab Younes <ehab.alyounes@gmail.com>
Co-authored-by: Ankit Sharma <74946350+ankitsharma101@users.noreply.github.com>
Co-authored-by: Simon Graband <sgraband@eclipsesource.com>
Co-authored-by: Maksim Kachurin <kachurun@gmail.com>
Co-authored-by: Camille Letavernier <cletavernier@eclipsesource.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author ready PRs that have at least one approval, no pending requests for changes, and a CI started. c++ Issues and PRs that require attention from people who are familiar with C++. needs-ci PRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

libuv assertion on Windows with Node.js 23.x

8 participants