Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ef58626
Fix Luna dictation alias test mock (#331405)
meganrogge Aug 18, 2026
c1eb30b
sessions: remove gaps above docked file trees (#331450)
sandy081 Aug 18, 2026
d07621e
Rename `style-override` to `modern-ui` (#331451)
mrleemurray Aug 18, 2026
b26ccfd
sharedProcess: Ignore missing language pack cache (#331432)
chrmarti Aug 18, 2026
f5e4ab3
agentHost: fix /fleet turn ownership after Plan → Interactive (#331410)
DonJayamanne Aug 18, 2026
c38c9ed
Disable Alt+click Close Others for single-tab groups (#331435)
Copilot Aug 18, 2026
ebaaae9
tunnels: preserve reconnect pause reasons (#331103)
ulugbekna Aug 18, 2026
f489b72
fix localization format string parsing (#331236)
sbatten Aug 18, 2026
2c31493
sessions: Open GitHub items in GitHub extension (#331471)
sandy081 Aug 18, 2026
c4c09dd
base: disable split-action dropdown when its primary action is disabl…
benibenj Aug 18, 2026
540fb00
change delay to 12 hrs by default (#331468)
sandy081 Aug 18, 2026
958eb5e
Refine header border and separator styles for modern UI (#331467)
mrleemurray Aug 18, 2026
523712b
Limit the surface which renders promo notifications (#331465)
lramos15 Aug 18, 2026
001bbef
Update tab hover styles and add test for tab action fading (#331476)
mrleemurray Aug 18, 2026
7870b73
build: increase CG notice timeout (#331399)
benvillalobos Aug 18, 2026
a91fc86
Update distro commit (main) (#331407)
vs-code-engineering[bot] Aug 18, 2026
b50a541
Modern UI: Enhance notification center styling (#331479)
mrleemurray Aug 18, 2026
c0b328e
Fix inconsistent Omni input window height growth (#331233)
Copilot Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@
"windows": {
"command": ".\\scripts\\code.bat"
},
"args": [
"--user-data-dir=${workspaceFolder}/.profile-oss",
"--extensions-dir=${workspaceFolder}/.profile-oss/extensions"
],
"inAgents": true,
"problemMatcher": []
},
Expand Down
2 changes: 1 addition & 1 deletion build/azure-pipelines/product-quality-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ jobs:
inputs:
outputfile: $(Build.SourcesDirectory)/ThirdPartyNotices.generated.txt
retryCountOnTaskFailure: 3
timeoutInMinutes: 15
timeoutInMinutes: 20
continueOnError: true
condition: and(succeeded(), eq(lower(variables['VSCODE_CIBUILD']), 'false'))

Expand Down
2 changes: 1 addition & 1 deletion build/lib/i18n.resources.json
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/styleOverrides",
"name": "vs/workbench/contrib/modernUI",
"project": "vscode-workbench"
},
{
Expand Down
2 changes: 1 addition & 1 deletion build/lib/policies/policyData.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -790,7 +790,7 @@
}
},
"type": "number",
"default": 2,
"default": 12,
"included": true
},
{
Expand Down
2 changes: 1 addition & 1 deletion build/lib/stylelint/validateHasSelectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ interface StylesheetScanResult {
/**
* Whether a selector contains a `:has()` attached to a compound that anchors on
* `body`, `html`, `:root` or `.monaco-workbench` - complete tokens only, at any
* position within the compound (`.style-override.monaco-workbench:has()` counts,
* position within the compound (`.modern-ui.monaco-workbench:has()` counts,
* `.monaco-workbench .foo:has()` and `.monaco-workbench-like:has()` do not).
* Such rules make DOM mutations anywhere pay workbench-wide style invalidation
* (microsoft/vscode#324985).
Expand Down
4 changes: 2 additions & 2 deletions build/lib/test/rootAnchoredHas.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ suite('stylelint root-anchored :has() check', () => {
test('flags root anchors regardless of position in the compound', () => {
assert.ok(containsRootAnchoredHas('body:has(.automation-dialog) .context-view.monaco-component'));
assert.ok(containsRootAnchoredHas('.monaco-workbench.floating-panels:has(.part.activitybar.compact) .part.statusbar'));
assert.ok(containsRootAnchoredHas('.style-override.monaco-workbench:has(.part.sidebar) .part'));
assert.ok(containsRootAnchoredHas('.modern-ui.monaco-workbench:has(.part.sidebar) .part'));
assert.ok(containsRootAnchoredHas('BODY:HAS(.foo)'));
assert.ok(containsRootAnchoredHas(':root:has(.foo)'));
assert.ok(containsRootAnchoredHas(':is(body, .embedded):has(.foo)'));
Expand All @@ -29,7 +29,7 @@ suite('stylelint root-anchored :has() check', () => {

test('ignores :has() anchored below the root', () => {
assert.ok(!containsRootAnchoredHas('.monaco-workbench .part > .title:has(.start-debug-action-item) > .title-actions'));
assert.ok(!containsRootAnchoredHas('.style-override.monaco-workbench .part:not(.editor):has(> .content)'));
assert.ok(!containsRootAnchoredHas('.modern-ui.monaco-workbench .part:not(.editor):has(> .content)'));
assert.ok(!containsRootAnchoredHas('.interactive-session .foo:has(.bar)'));
assert.ok(!containsRootAnchoredHas('.automations-list-widget .automations-row:has(:focus-visible)'));
assert.ok(!containsRootAnchoredHas('.foo:not(.monaco-workbench):has(.bar)'));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { MockChatMLFetcher } from '../../../../platform/chat/test/common/mockCha
import { CopilotToken, createTestExtendedTokenInfo } from '../../../../platform/authentication/common/copilotToken';
import { ICopilotTokenManager } from '../../../../platform/authentication/common/copilotTokenManager';
import { IAutomodeService } from '../../../../platform/endpoint/node/automodeService';
import { AutoChatEndpoint } from '../../../../platform/endpoint/node/autoChatEndpoint';
import { IEndpointProvider } from '../../../../platform/endpoint/common/endpointProvider';
import { CustomDataPartMimeTypes } from '../../../../platform/endpoint/common/endpointTypes';
import { CopilotChatEndpoint } from '../../../../platform/endpoint/node/copilotChatEndpoint';
Expand Down Expand Up @@ -462,10 +463,11 @@ suite('LanguageModelAccess model info', () => {
getCopilotToken: async () => copilotToken,
resetCopilotToken: () => { },
} as unknown as ICopilotTokenManager);
const autoPickerEndpoint = new DeferredPromise<IChatEndpoint>();
testingServiceCollection.define(IAutomodeService, {
_serviceBrand: undefined,
resolveAutoModeEndpoint: async () => lunaEndpoint,
resolveAutoModePickerEndpoint: async () => lunaEndpoint,
resolveAutoModePickerEndpoint: () => autoPickerEndpoint.p,
getAutoPickerMetadata: () => ({ discountRange: { low: 0, high: 0 } }),
areAutoModeTiersSupported: () => false,
onDidChangeAutoModeTierSupport: Event.None,
Expand All @@ -481,10 +483,12 @@ suite('LanguageModelAccess model info', () => {
getEmbeddingsEndpoint: async () => { throw new Error('Not implemented in test'); },
} as unknown as IEndpointProvider);
const accessor = testingServiceCollection.createTestingAccessor();
autoPickerEndpoint.complete(accessor.get(IInstantiationService).createInstance(AutoChatEndpoint, lunaEndpoint, '', 0, { low: 0, high: 0 }));
const extensionContext = accessor.get(IVSCodeExtensionContext);
const version = accessor.get(IEnvService).getVersion();
await extensionContext.globalState.update('lmBaseCount/gpt-5.6-luna', { extensionVersion: version, baseCount: 0 });
await extensionContext.globalState.update('lmBaseCount/some-hidden-model', { extensionVersion: version, baseCount: 0 });
await extensionContext.globalState.update('lmBaseCount/auto', { extensionVersion: version, baseCount: 0 });
const languageModelAccess = accessor.get(IInstantiationService).createInstance(LanguageModelAccess);
try {
const testAccess = languageModelAccess as unknown as {
Expand Down Expand Up @@ -527,6 +531,7 @@ suite('LanguageModelAccess model info', () => {
languageModelAccess.dispose();
await extensionContext.globalState.update('lmBaseCount/gpt-5.6-luna', undefined);
await extensionContext.globalState.update('lmBaseCount/some-hidden-model', undefined);
await extensionContext.globalState.update('lmBaseCount/auto', undefined);
}
});
});
Expand Down
2 changes: 1 addition & 1 deletion extensions/copilot/src/util/vs/nls.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ function _format(message: string, args: (string | number | boolean | undefined |
result = message;
} else {
result = message.replace(/\{(\d+)\}/g, (match, rest) => {
const index = rest[0];
const index = parseInt(rest, 10);
const arg = args[index];
let result = match;
if (typeof arg === 'string') {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "code-oss-dev",
"version": "1.135.0",
"distro": "c125b2a2432ff78b2d1f7b8ed8b0c67cf3af6187",
"distro": "5475972d5042caa842cdccf21488c4d0728ca0c1",
"author": {
"name": "Microsoft Corporation"
},
Expand Down
6 changes: 3 additions & 3 deletions src/vs/base/browser/ui/contextview/contextview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export interface IContextViewCloseAnimation {
export const CONTEXT_VIEW_MENU_MOTION_CLASS = 'context-view-menu-motion';
export const CONTEXT_VIEW_MENU_MOTION_CLOSING_CLASS = 'context-view-menu-motion-closing';
export const CONTEXT_VIEW_MENU_MOTION_CLOSE_ANIMATION_DURATION = 150;
export const CONTEXT_VIEW_MENU_MOTION_ANCESTOR_CLASSES = ['style-override', 'monaco-enable-motion'] as const;
export const CONTEXT_VIEW_MENU_MOTION_ANCESTOR_CLASSES = ['modern-ui', 'monaco-enable-motion'] as const;
export const CONTEXT_VIEW_CLOSE_ANIMATION_DURATION_VARIABLE = '--vscode-context-view-close-animation-duration';
export const CONTEXT_VIEW_MENU_MOTION_SHADOW_VARIABLE = '--vscode-context-view-menu-motion-shadow';
const CONTEXT_VIEW_MENU_MOTION_CLOSE_START_OPACITY_VARIABLE = '--vscode-context-view-menu-motion-close-start-opacity';
Expand Down Expand Up @@ -145,7 +145,7 @@ let contextViewMenuMotionStyleSheet: HTMLStyleElement | undefined;
function ensureContextViewMenuMotionStyleSheet(): void {
if (!contextViewMenuMotionStyleSheet) {
contextViewMenuMotionStyleSheet = createStyleSheet(undefined, style => {
style.textContent = getContextViewMenuMotionCss('.style-override.monaco-enable-motion');
style.textContent = getContextViewMenuMotionCss('.modern-ui.monaco-enable-motion');
});
}
}
Expand Down Expand Up @@ -509,5 +509,5 @@ const SHADOW_ROOT_CSS = /* css */ `
:host-context(.linux:lang(zh-Hant)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; }
:host-context(.linux:lang(ja)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; }
:host-context(.linux:lang(ko)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; }
${getContextViewMenuMotionCss(':host-context(.style-override.monaco-enable-motion)')}
${getContextViewMenuMotionCss(':host-context(.modern-ui.monaco-enable-motion)')}
`;
21 changes: 17 additions & 4 deletions src/vs/base/browser/ui/dropdown/dropdown.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export interface ILabelRenderer {
export interface IBaseDropdownOptions {
label?: string;
labelRenderer?: ILabelRenderer;
isEnabled?: () => boolean;
}

export class BaseDropdown extends ActionRunner {
Expand All @@ -39,17 +40,17 @@ export class BaseDropdown extends ActionRunner {

private hover: IManagedHover | undefined;

constructor(container: HTMLElement, options: IBaseDropdownOptions) {
constructor(container: HTMLElement, private readonly baseOptions: IBaseDropdownOptions) {
super();

this._element = append(container, $('.monaco-dropdown'));

this._label = append(this._element, $('.dropdown-label'));

let labelRenderer = options.labelRenderer;
let labelRenderer = baseOptions.labelRenderer;
if (!labelRenderer) {
labelRenderer = (container: HTMLElement): IDisposable | null => {
container.textContent = options.label || '';
container.textContent = baseOptions.label || '';

return null;
};
Expand All @@ -61,6 +62,10 @@ export class BaseDropdown extends ActionRunner {

for (const event of [EventType.MOUSE_DOWN, GestureEventType.Tap]) {
this._register(addDisposableListener(this._label, event, e => {
if (baseOptions.isEnabled?.() === false) {
return;
}

if (isMouseEvent(e) && e.button !== 0) {
// prevent right click trigger to allow separate context menu (https://github.com/microsoft/vscode/issues/151064)
return;
Expand All @@ -79,6 +84,10 @@ export class BaseDropdown extends ActionRunner {
if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) {
EventHelper.stop(e, true); // https://github.com/microsoft/vscode/issues/57997

if (baseOptions.isEnabled?.() === false) {
return;
}

if (this.visible) {
this.hide();
} else {
Expand Down Expand Up @@ -114,7 +123,7 @@ export class BaseDropdown extends ActionRunner {
}

show(): void {
if (!this.visible) {
if (!this.visible && this.baseOptions.isEnabled?.() !== false) {
this.visible = true;
this._onDidChangeVisibility.fire(true);
}
Expand Down Expand Up @@ -208,6 +217,10 @@ export class DropdownMenu extends BaseDropdown {
}

override show(): void {
if (this._options.isEnabled?.() === false) {
return;
}

super.show();

this.element.classList.add('active');
Expand Down
11 changes: 10 additions & 1 deletion src/vs/base/browser/ui/dropdown/dropdownActionViewItem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export class DropdownMenuActionViewItem extends BaseActionViewItem {
const options: IDropdownMenuOptions = {
contextMenuProvider: this.contextMenuProvider,
labelRenderer: labelRenderer,
isEnabled: () => this.action.enabled,
menuAsChild: this.options.menuAsChild,
actions: isActionsArray ? this.menuActionsOrProvider as IAction[] : undefined,
actionProvider: isActionsArray ? undefined : this.menuActionsOrProvider as IActionProvider,
Expand Down Expand Up @@ -183,6 +184,7 @@ export class DropdownMenuActionViewItem extends BaseActionViewItem {
const disabled = !this.action.enabled;
this.actionItem?.classList.toggle('disabled', disabled);
this.element?.classList.toggle('disabled', disabled);
this.element?.setAttribute('aria-disabled', String(disabled));
}
}

Expand Down Expand Up @@ -221,7 +223,7 @@ export class ActionWithDropdownActionViewItem extends ActionViewItem {
separator.classList.toggle('prominent', menuActionClassNames.includes('prominent'));
append(this.element, separator);

this.dropdownMenuActionViewItem = this._register(new DropdownMenuActionViewItem(this._register(new Action('dropdownAction', nls.localize('moreActions', "More Actions..."))), menuActionsProvider, this.contextMenuProvider, {
this.dropdownMenuActionViewItem = this._register(new DropdownMenuActionViewItem(this._register(new Action('dropdownAction', nls.localize('moreActions', "More Actions..."), undefined, this.action.enabled)), menuActionsProvider, this.contextMenuProvider, {
classNames: ['dropdown', ...ThemeIcon.asClassNameArray(Codicon.dropDownButton), ...menuActionClassNames],
hoverDelegate: this.options.hoverDelegate,
keybindingProvider: (<IActionWithDropdownActionViewItemOptions>this.options).keybindingProvider,
Expand Down Expand Up @@ -261,4 +263,11 @@ export class ActionWithDropdownActionViewItem extends ActionViewItem {
super.setFocusable(focusable);
this.dropdownMenuActionViewItem?.setFocusable(focusable);
}

protected override updateEnabled(): void {
super.updateEnabled();
if (this.dropdownMenuActionViewItem) {
this.dropdownMenuActionViewItem.action.enabled = this.action.enabled;
}
}
}
6 changes: 3 additions & 3 deletions src/vs/base/test/browser/ui/contextview/contextview.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ suite('ContextView', () => {
test('hide() delays render disposal for close animations', () => {
const clock = sinon.useFakeTimers();
const container = $('.container');
container.classList.add('style-override', 'monaco-enable-motion');
container.classList.add('modern-ui', 'monaco-enable-motion');
const contextView = new ContextView(container, ContextViewDOMPosition.ABSOLUTE);

let disposeCount = 0;
Expand All @@ -61,7 +61,7 @@ suite('ContextView', () => {
closeAnimation: {
className: 'closing',
duration: 100,
requiredAncestorClasses: ['style-override', 'monaco-enable-motion']
requiredAncestorClasses: ['modern-ui', 'monaco-enable-motion']
}
};

Expand Down Expand Up @@ -215,7 +215,7 @@ suite('ContextView', () => {

test('menu motion does not retain a containing block for submenus (#326248)', () => {
const container = $('.container');
container.classList.add('style-override', 'monaco-enable-motion');
container.classList.add('modern-ui', 'monaco-enable-motion');
document.body.appendChild(container);

const surface = $('.monaco-scrollable-element');
Expand Down
30 changes: 30 additions & 0 deletions src/vs/base/test/common/nls.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { strictEqual } from 'assert';
import { localize, localize2 } from '../../../nls.js';
import { ensureNoDisposablesAreLeakedInTestSuite } from './utils.js';

suite('NLS', () => {
ensureNoDisposablesAreLeakedInTestSuite();

test('localize replaces placeholders by index', () => {
strictEqual(localize('key0', '{0} {1} {2}', 'a', 'b', 'c'), 'a b c');
});

test('localize replaces multi digit placeholders', () => {
const args = ['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10', 'a11'];
strictEqual(localize('key1', '{0} {1} {9} {10} {11}', ...args), 'a0 a1 a9 a10 a11');
});

test('localize keeps placeholders that are not replaceable', () => {
strictEqual(localize('key2', '{0} {1}', 'a', {} as unknown as string), 'a {1}');
});

test('localize2 replaces multi digit placeholders', () => {
const args = ['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10'];
strictEqual(localize2('key3', '{10}', ...args).value, 'a10');
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,10 @@ export class LanguagePackCachedDataCleaner extends Disposable {
}
}

private async cleanUpLanguagePackCache(): Promise<void> {
/**
* Public for testing.
*/
async cleanUpLanguagePackCache(): Promise<void> {
this.logService.trace('[language pack cache cleanup]: Starting to clean up unused language packs.');

try {
Expand Down Expand Up @@ -89,7 +92,15 @@ export class LanguagePackCachedDataCleaner extends Disposable {
const now = Date.now();
for (const packEntry of Object.keys(installed)) {
const folder = join(cacheDir, packEntry);
const entries = await Promises.readdir(folder);
let entries: string[];
try {
entries = await Promises.readdir(folder);
} catch (error) {
if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
continue;
}
throw error;
}
for (const entry of entries) {
if (entry === 'tcf.json') {
continue;
Expand Down
Loading
Loading