Selected changesmerged Sep 5, 2026
fix: route info segment overrides not updating in dev overlayTypeScript · 52 + / 26 −
Introduces 3 new declarations in packages/next/src/next-devtools/dev-overlay/segment-explorer-trie.ts.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
packages/next/src/next-devtools/dev-overlay/segment-explorer-trie.ts ↗ · 2 files
@@ -75,55 +75,81 @@ function createTrie<Value = string>({ } } - function insert(value: Value) {- let currentNode = root- const segments = getCharacters(value)+ function copyChildren(children: TrieNode<Value>['children']) {+ return Object.assign(Object.create(null), children)+ } + // Snapshots must be immutable for `useSyncExternalStore` consumers, so+ // updates copy the nodes along the mutated path instead of mutating them+ // in place. Untouched subtrees stay shared.+ function copyPath(segments: string[]): TrieNode<Value>[] {+ const newRoot: TrieNode<Value> = {+ value: root.value,+ children: copyChildren(root.children),+ }++ const path: TrieNode<Value>[] = [newRoot]+ let currentNode = newRoot for (const segment of segments) {- if (!currentNode.children[segment]) {- currentNode.children[segment] = {- value: undefined,- // Skip value for intermediate nodes- children: Object.create(null),- }+ const existingNode = currentNode.children[segment]+ const copiedNode: TrieNode<Value> = {+ value: existingNode?.value,+ children: existingNode+ ? copyChildren(existingNode.children)
Fix Copilot Sessions Provider to Resolve Changes Summary CorrectlyTypeScript · 27 + / 16 −
Introduces 1 new declaration in src/vs/sessions/contrib/providers/copilotChatSessions/browser/copilotChatSessionsProvider.ts.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
src/vs/sessions/contrib/providers/copilotChatSessions/browser/copilotChatSessionsProvider.ts ↗ · 2 files
@@ -1272,22 +1285,18 @@ class AgentSessionAdapter implements ICopilotChatSession { } private _extractChanges(session: IAgentSession): readonly ISessionFileChange[] {- if (!session.changes) {- return [];- }- if (Array.isArray(session.changes)) {- return session.changes as ISessionFileChange[];- }- // Summary object — create a synthetic entry for total insertions/deletions- const summary = session.changes as { readonly files: number; readonly insertions: number; readonly deletions: number };- if (summary.insertions > 0 || summary.deletions > 0) {- return [{- modifiedUri: URI.parse('summary://changes'),- insertions: summary.insertions,- deletions: summary.deletions,- }];+ return session.changes && !isChangesSummary(session.changes) ? session.changes : [];+ }++ private _extractChangesSummary(session: IAgentSession): ISessionChangesSummary | undefined {+ if (!isChangesSummary(session.changes)) {+ return undefined; }- return [];+ return {+ files: session.changes.files,+ additions: session.changes.insertions,+ deletions: session.changes.deletions,+ }; } private _extractCheckpoints(session: IAgentSession): IChatCheckpoints | undefined {
crypto: fix multi-prime RSA JWKsC++ · 102 + / 8 −
Reworks 99 lines of existing logic in src/crypto/crypto_rsa.cc.
Changes how existing runtime behaves. Tests changed with it, with code of their own.
src/crypto/crypto_rsa.cc ↗ · 7 files
@@ -417,19 +448,79 @@ KeyObjectData ImportJWKRsaKey(Environment* env, Local<Object> jwk) { ByteSource dq = ByteSource::FromEncodedString(env, dq_value.As<String>()); ByteSource qi = ByteSource::FromEncodedString(env, qi_value.As<String>()); - if (!rsa_view.setPrivateKey(- d.ToBN(), q.ToBN(), p.ToBN(), dp.ToBN(), dq.ToBN(), qi.ToBN())) {+ ncrypto::Rsa::OtherPrimeInfoPointers other_prime_infos;+ if (!oth_value->IsUndefined()) {+ if (!oth_value->IsArray()) {+ THROW_ERR_CRYPTO_INVALID_JWK(env, "Invalid JWK RSA key");+ return {};+ }++ Local<Array> oth = oth_value.As<Array>();+ const uint32_t length = oth->Length();+ if (length == 0 || length > kMaxRsaOtherPrimeInfos) {+ THROW_ERR_CRYPTO_INVALID_JWK(env, "Invalid JWK RSA key");+ return {};+ }+ other_prime_infos.reserve(length);+ for (uint32_t i = 0; i < length; i++) {+ Local<Value> item_value;+ Local<Value> r_value;+ Local<Value> other_d_value;+ Local<Value> t_value;+ if (!oth->Get(env->context(), i).ToLocal(&item_value) ||+ !item_value->IsObject()) {+ THROW_ERR_CRYPTO_INVALID_JWK(env, "Invalid JWK RSA key");+ return {};+ }++ Local<Object> item = item_value.As<Object>();+ if (!item->Get(env->context(), env->jwk_r_string()).ToLocal(&r_value) ||+ !item->Get(env->context(), env->jwk_d_string())
box: fixup map/try_map deallocate callsRust · 14 + / 6 −
Reworks 10 lines of existing logic in library/alloc/src/boxed.rs.
Changes how existing language design behaves. Read the linked PR for the surrounding test context.
library/alloc/src/boxed.rs ↗ · 1 files
@@ -731,12 +731,16 @@ impl<T, A: Allocator> Box<T, A> { let (value, allocation) = Box::take(this); let (raw, alloc) = Box::into_non_null_with_allocator(allocation); if size_of::<T>() == size_of::<U>() && align_of::<T>() == align_of::<U>() {- // ignore-tidy-undocumented-unsafe+ // SAFETY: We checked that the memory requirements are the same for both types+ // and `raw` is already a valid pointer for the requisite memory. let allocation = unsafe { Box::from_non_null_in(raw.cast::<MaybeUninit<U>>(), alloc) }; Box::write(allocation, f(value)) } else {- // ignore-tidy-undocumented-unsafe- unsafe { alloc.deallocate(raw.cast(), Layout::for_value(&value)) }+ if size_of::<T>() != 0 {+ // SAFETY: `raw` isn't dangling since it points to a non-zero-sized+ // allocation and is never used again after this point.+ unsafe { alloc.deallocate(raw.cast(), Layout::for_value(&value)) }+ } Box::new_in(f(value), alloc) } }