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