Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6ae33b0
update selection background colors in 2026 dark and light themes for …
mrleemurray Mar 5, 2026
79fbc6b
Sessions: Show repo name with worktree basename in workspace folder l…
sandy081 Mar 5, 2026
cbcd2d7
Merge pull request #299451 from microsoft/mrleemurray/conventional-ta…
mrleemurray Mar 5, 2026
91c1a5a
sessions - hide "Open as Editor" and "Open to the Side" in agent sess…
bpasero Mar 5, 2026
3488ba4
sessions - allow all workbench commands when `useModal` is `all` (#29…
bpasero Mar 5, 2026
a29d3c0
Fix disabledForeground color in 2026 Dark theme
mrleemurray Mar 5, 2026
4e443a1
sessions - show folder icon instead of worktree when session has no w…
bpasero Mar 5, 2026
8017e75
Merge pull request #299458 from microsoft/mrleemurray/smoggy-orange-s…
mrleemurray Mar 5, 2026
c35a1a5
Fix SCM input widget ignoring `editor.roundedSelection` setting (#299…
Copilot Mar 5, 2026
c08bdfc
feat: add optional id field to ChatRequestModeInstructions interface …
DonJayamanne Mar 5, 2026
5b18dda
refactor(chat): update structure and styling for context usage widget
mrleemurray Mar 5, 2026
5ffa330
refactor(chat): remove unused actions section and clean up CSS
mrleemurray Mar 5, 2026
5a8fb3c
Apply suggestion from @Copilot
mrleemurray Mar 5, 2026
f957df8
Apply suggestion from @Copilot
mrleemurray Mar 5, 2026
32acff1
Apply suggestion from @Copilot
mrleemurray Mar 5, 2026
2df781b
sessions - allowlist more commands to run in modal editors (#299464)
bpasero Mar 5, 2026
0e211b2
Merge pull request #299475 from microsoft/mrleemurray/update-context-…
mrleemurray Mar 5, 2026
0c87a51
sessions - do not steal focus when auto-opening changes view (#299487)
bpasero Mar 5, 2026
1a60847
fix: update precondition for FixDiagnosticsAction and hide input widg…
jrieken Mar 5, 2026
61dc401
workaround for https://github.com/microsoft/vscode/issues/299484 (#29…
jrieken Mar 5, 2026
9a4492f
Cleanup some team members from end game notebook (#299507)
lramos15 Mar 5, 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
2 changes: 1 addition & 1 deletion .vscode/notebooks/my-endgame.github-issues
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$NOT_TEAM_MEMBERS=-author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:bamurtaugh -author:bpasero -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:ntrogh -author:hediet -author:isidorn -author:joaomoreno -author:jrieken -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger -author:karthiknadig -author:eleanorjboyd -author:Yoyokrazy -author:ulugbekna -author:aiday-mar -author:bhavyaus -author:justschen -author:benibenj -author:luabud -author:anthonykim1 -author:joshspicer -author:osortega -author:hawkticehurst -author:pierceboggan -author:benvillalobos -author:dileepyavan -author:dineshc-msft -author:dmitrivMS -author:eli-w-king -author:jo-oikawa -author:jruales -author:jytjyt05 -author:kycutler -author:mrleemurray -author:pwang347 -author:vijayupadya -author:bryanchen-d -author:cwebster-99 -author:rwoll -author:lostintangent -author:jukasper -author:zhichli"
"value": "$NOT_TEAM_MEMBERS=-author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:bamurtaugh -author:bpasero -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:ntrogh -author:hediet -author:isidorn -author:joaomoreno -author:jrieken -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:TylerLeonhardt -author:Tyriar -author:amunger -author:karthiknadig -author:eleanorjboyd -author:Yoyokrazy -author:ulugbekna -author:aiday-mar -author:bhavyaus -author:justschen -author:benibenj -author:luabud -author:anthonykim1 -author:joshspicer -author:osortega -author:hawkticehurst -author:pierceboggan -author:benvillalobos -author:dileepyavan -author:dmitrivMS -author:eli-w-king -author:jo-oikawa -author:jruales -author:jytjyt05 -author:kycutler -author:mrleemurray -author:pwang347 -author:vijayupadya -author:bryanchen-d -author:cwebster-99 -author:rwoll -author:lostintangent -author:jukasper -author:zhichli"
},
{
"kind": 1,
Expand Down
4 changes: 2 additions & 2 deletions extensions/theme-2026/themes/2026-dark.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"type": "dark",
"colors": {
"foreground": "#bfbfbf",
"disabledForeground": "#666666",
"disabledForeground": "#555555",
"errorForeground": "#f48771",
"descriptionForeground": "#8C8C8C",
"icon.foreground": "#8C8C8C",
Expand Down Expand Up @@ -110,7 +110,7 @@
"editorLineNumber.foreground": "#858889",
"editorLineNumber.activeForeground": "#BBBEBF",
"editorCursor.foreground": "#BBBEBF",
"editor.selectionBackground": "#27678280",
"editor.selectionBackground": "#276782dd",
"editor.inactiveSelectionBackground": "#27678260",
"editor.selectionHighlightBackground": "#27678260",
"editor.wordHighlightBackground": "#27678250",
Expand Down
2 changes: 1 addition & 1 deletion extensions/theme-2026/themes/2026-light.json
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@
"editorLineNumber.foreground": "#606060",
"editorLineNumber.activeForeground": "#202020",
"editorCursor.foreground": "#202020",
"editor.selectionBackground": "#0069CC1A",
"editor.selectionBackground": "#0069CC40",
"editor.inactiveSelectionBackground": "#0069CC1A",
"editor.selectionHighlightBackground": "#0069CC15",
"editor.wordHighlightBackground": "#0069CC26",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export class ToggleChangesViewContribution extends Disposable {

private syncAuxiliaryBarVisibility(hasChanges: boolean): void {
if (hasChanges) {
this.viewsService.openView(CHANGES_VIEW_ID, true);
this.viewsService.openView(CHANGES_VIEW_ID, false);
} else {
this.layoutService.setPartHidden(true, Parts.AUXILIARYBAR_PART);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ import { AgentSessionsPicker } from '../../../../workbench/contrib/chat/browser/
import { autorun } from '../../../../base/common/observable.js';
import { IChatService } from '../../../../workbench/contrib/chat/common/chatService/chatService.js';
import { ThemeIcon } from '../../../../base/common/themables.js';
import { getAgentSessionProvider, getAgentSessionProviderIcon } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessions.js';
import { AgentSessionProviders, getAgentSessionProvider, getAgentSessionProviderIcon } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessions.js';
import { Codicon } from '../../../../base/common/codicons.js';
import { basename } from '../../../../base/common/resources.js';
import { IsAuxiliaryWindowContext } from '../../../../workbench/common/contextkeys.js';
import { SessionsWelcomeVisibleContext } from '../../../common/contextkeys.js';
Expand Down Expand Up @@ -290,6 +291,12 @@ export class SessionsTitleBarWidget extends BaseActionViewItem {
// Try to get icon from the agent session model (has provider-resolved icon)
const agentSession = this.agentSessionsService.getSession(activeSession.resource);
if (agentSession) {
// For background sessions, distinguish worktree vs folder based on metadata
if (agentSession.providerType === AgentSessionProviders.Background) {
const hasWorktree = typeof agentSession.metadata?.worktreePath === 'string';
return hasWorktree ? Codicon.worktree : Codicon.folder;
}

return agentSession.icon;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export class WorkspaceFolderManagementContribution extends Disposable implements
if (session.worktree) {
return {
uri: session.worktree,
name: session.repository ? `${this.uriIdentityService.extUri.basename(session.repository)} (worktree)` : undefined
name: session.repository ? `${this.uriIdentityService.extUri.basename(session.repository)} (${this.uriIdentityService.extUri.basename(session.worktree)})` : this.uriIdentityService.extUri.basename(session.worktree)
};
}

Expand Down
1 change: 1 addition & 0 deletions src/vs/workbench/api/common/extHostTypeConverters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3607,6 +3607,7 @@ export namespace ChatRequestModeInstructions {
export function to(mode: IChatRequestModeInstructions | undefined): vscode.ChatRequestModeInstructions | undefined {
if (mode) {
return {
uri: URI.revive(mode.uri),
name: mode.name,
content: mode.content,
toolReferences: ChatLanguageModelToolReferences.to(mode.toolReferences),
Expand Down
61 changes: 55 additions & 6 deletions src/vs/workbench/browser/parts/editor/modalEditorPart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import { IEditorService } from '../../../services/editor/common/editorService.js
import { EditorPartModalContext, EditorPartModalMaximizedContext, EditorPartModalNavigationContext } from '../../../common/contextkeys.js';
import { EditorResourceAccessor, SideBySideEditor, Verbosity } from '../../../common/editor.js';
import { ResourceLabel } from '../../labels.js';
import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';
import { IHostService } from '../../../services/host/browser/host.js';
import { IWorkbenchLayoutService, Parts } from '../../../services/layout/browser/layoutService.js';
import { mainWindow } from '../../../../base/browser/window.js';
Expand All @@ -36,12 +35,55 @@ import { CLOSE_MODAL_EDITOR_COMMAND_ID, MOVE_MODAL_EDITOR_TO_MAIN_COMMAND_ID, MO
import { IModalEditorNavigation, IModalEditorPartOptions } from '../../../../platform/editor/common/editor.js';

const defaultModalEditorAllowableCommands = new Set([

// Application
'workbench.action.quit',
'workbench.action.reloadWindow',
'workbench.action.closeActiveEditor',
'workbench.action.closeAllEditors',
'workbench.action.toggleFullScreen',

// Quick access
'workbench.action.gotoSymbol',
'workbench.action.gotoLine',

// Zoom
'workbench.action.zoomIn',
'workbench.action.zoomOut',
'workbench.action.zoomReset',

// File operations
'workbench.action.files.save',
'workbench.action.files.saveAll',
'workbench.action.files.revert',

// Close editors
'workbench.action.closeActiveEditor',
'workbench.action.closeAllEditors',
'workbench.action.closeEditorsInGroup',
'workbench.action.closeUnmodifiedEditors',

// Settings
'workbench.action.openSettings',
'workbench.action.openSettings2',
'workbench.action.openSettingsJson',
'workbench.action.openGlobalSettings',
'workbench.action.openApplicationSettingsJson',
'workbench.action.openRawDefaultSettings',
'workbench.action.openWorkspaceSettings',
'workbench.action.openWorkspaceSettingsFile',
'workbench.action.openFolderSettings',
'workbench.action.openFolderSettingsFile',
'workbench.action.openRemoteSettings',
'workbench.action.openRemoteSettingsFile',
'workbench.action.openAccessibilitySettings',
'workbench.action.configureLanguageBasedSettings',

// Keybindings
'workbench.action.openGlobalKeybindings',
'workbench.action.openDefaultKeybindingsFile',
'workbench.action.openGlobalKeybindingsFile',
'workbench.action.openKeyboardLayoutPicker',

// Modal editor
CLOSE_MODAL_EDITOR_COMMAND_ID,
MOVE_MODAL_EDITOR_TO_MAIN_COMMAND_ID,
MOVE_MODAL_EDITOR_TO_WINDOW_COMMAND_ID,
Expand All @@ -65,7 +107,7 @@ export class ModalEditorPart {
@IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService,
@IKeybindingService private readonly keybindingService: IKeybindingService,
@IHostService private readonly hostService: IHostService,
@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,
@IConfigurationService private readonly configurationService: IConfigurationService,
) {
}

Expand All @@ -86,11 +128,18 @@ export class ModalEditorPart {
}
}));

let useModalMode = this.configurationService.getValue<string>('workbench.editor.useModal');
disposables.add(this.configurationService.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('workbench.editor.useModal')) {
useModalMode = this.configurationService.getValue<string>('workbench.editor.useModal');
}
}));

disposables.add(addDisposableListener(modalElement, EventType.KEY_DOWN, e => {
const event = new StandardKeyboardEvent(e);

// Prevent unsupported commands (not in sessions windows)
if (!this.environmentService.isSessionsWindow) {
// Prevent unsupported commands unless all editors open in modal
if (useModalMode !== 'all') {
const resolved = this.keybindingService.softDispatch(event, this.layoutService.mainContainer);
if (resolved.kind === ResultKind.KbFound && resolved.commandId) {
if (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { ChatViewPane } from '../widgetHosts/viewPane/chatViewPane.js';
import { ICommandService } from '../../../../../platform/commands/common/commands.js';
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
import { AgentSessionsPicker } from './agentSessionsPicker.js';
import { ActiveEditorContext } from '../../../../common/contextkeys.js';
import { ActiveEditorContext, IsSessionsWindowContext } from '../../../../common/contextkeys.js';
import { IQuickInputService } from '../../../../../platform/quickinput/common/quickInput.js';
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
import { KeyCode, KeyMod } from '../../../../../base/common/keyCodes.js';
Expand Down Expand Up @@ -708,10 +708,11 @@ export class OpenAgentSessionInEditorGroupAction extends BaseOpenAgentSessionAct
primary: KeyMod.WinCtrl | KeyCode.Enter
},
weight: KeybindingWeight.WorkbenchContrib + 1,
when: ChatContextKeys.agentSessionsViewerFocused,
when: ContextKeyExpr.and(ChatContextKeys.agentSessionsViewerFocused, IsSessionsWindowContext.negate()),
},
menu: {
id: MenuId.AgentSessionsContext,
when: IsSessionsWindowContext.negate(),
order: 1,
group: 'navigation'
}
Expand Down Expand Up @@ -741,10 +742,11 @@ export class OpenAgentSessionInNewEditorGroupAction extends BaseOpenAgentSession
primary: KeyMod.WinCtrl | KeyMod.Alt | KeyCode.Enter
},
weight: KeybindingWeight.WorkbenchContrib + 1,
when: ChatContextKeys.agentSessionsViewerFocused,
when: ContextKeyExpr.and(ChatContextKeys.agentSessionsViewerFocused, IsSessionsWindowContext.negate()),
},
menu: {
id: MenuId.AgentSessionsContext,
when: IsSessionsWindowContext.negate(),
order: 2,
group: 'navigation'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge
kind: this.currentModeKind,
isBuiltin: mode.isBuiltin,
modeInstructions: modeInstructions ? {
uri: mode.uri?.get(),
name: mode.name.get(),
content: modeInstructions.content,
toolReferences: this.toolService.toToolReferences(modeInstructions.toolReferences),
Expand Down Expand Up @@ -3145,7 +3146,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge
const inputToolbarWidth = this.cachedInputToolbarWidth = this.inputActionsToolbar.getItemsWidth();
const executeToolbarPadding = (this.executeToolbar.getItemsLength() - 1) * toolbarItemGap;
const inputToolbarPadding = this.inputActionsToolbar.getItemsLength() ? (this.inputActionsToolbar.getItemsLength() - 1) * toolbarItemGap : 0;
const contextUsageWidth = dom.getTotalWidth(this.contextUsageWidgetContainer);
const contextUsageWidth = 0;// dom.getTotalWidth(this.contextUsageWidgetContainer);
const inputToolbarsPadding = 12; // pdading between input toolbar/execute toolbar/contextUsage.
return executeToolbarWidth + executeToolbarPadding + contextUsageWidth + (this.options.renderInputToolbarBelowInput ? 0 : inputToolbarWidth + inputToolbarPadding + inputToolbarsPadding);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,36 +52,32 @@ export class ChatContextUsageDetails extends Disposable {

this.domNode = $('.chat-context-usage-details');

// Using same structure as ChatUsageWidget quota items
this.quotaItem = this.domNode.appendChild($('.quota-item'));
// Quota indicator — using same structure as ChatStatusDashboard
this.quotaItem = this.domNode.appendChild($('.quota-indicator'));

// Header row with label
const quotaItemHeader = this.quotaItem.appendChild($('.quota-item-header'));
const quotaItemLabel = quotaItemHeader.appendChild($('.quota-item-label'));
quotaItemLabel.textContent = localize('contextWindow', "Context Window");
// Header row
const header = this.domNode.insertBefore($('div.header'), this.quotaItem);
header.textContent = localize('contextWindow', "Context Window");

// Token count and percentage row (on same line)
const tokenRow = this.quotaItem.appendChild($('.token-row'));
this.tokenCountLabel = tokenRow.appendChild($('.token-count-label'));
this.percentageLabel = tokenRow.appendChild($('.quota-item-value'));
// Quota label row with token count + percentage
const quotaLabel = this.quotaItem.appendChild($('.quota-label'));
this.tokenCountLabel = quotaLabel.appendChild($('span'));
this.percentageLabel = quotaLabel.appendChild($('span.quota-value'));

// Progress bar - using same structure as chat usage widget
// Progress bar
const progressBar = this.quotaItem.appendChild($('.quota-bar'));
this.progressFill = progressBar.appendChild($('.quota-bit'));

// Token details container (for category breakdown)
this.tokenDetailsContainer = this.domNode.appendChild($('.token-details-container'));

// Warning message (shown when usage is high)
this.warningMessage = this.domNode.appendChild($('.warning-message'));
this.warningMessage = this.domNode.appendChild($('div.description'));
this.warningMessage.textContent = localize('qualityWarning', "Quality may decline as limit nears.");
this.warningMessage.style.display = 'none';

// Actions section with header, separator, and button bar
// Actions section with button bar
this.actionsSection = this.domNode.appendChild($('.actions-section'));
this.actionsSection.appendChild($('.separator'));
const actionsHeader = this.actionsSection.appendChild($('.actions-header'));
actionsHeader.textContent = localize('actions', "Actions");
const buttonBarContainer = this.actionsSection.appendChild($('.button-bar-container'));
this._register(this.instantiationService.createInstance(MenuWorkbenchButtonBar, buttonBarContainer, MenuId.ChatContextUsageActions, {
toolbarOptions: {
Expand All @@ -104,14 +100,14 @@ export class ChatContextUsageDetails extends Disposable {
update(data: IChatContextUsageData): void {
const { percentage, usedTokens, totalContextWindow, promptTokenDetails } = data;

// Update token count and percentage on same line
// Update token count and percentage
this.tokenCountLabel.textContent = localize(
'tokenCount',
"{0} / {1} tokens",
this.formatTokenCount(usedTokens, 1),
this.formatTokenCount(totalContextWindow, 0)
);
this.percentageLabel.textContent = `• ${percentage.toFixed(0)}%`;
this.percentageLabel.textContent = localize('quotaDisplay', "{0}%", percentage.toFixed(0));

// Update progress bar
this.progressFill.style.width = `${Math.min(100, percentage)}%`;
Expand Down
Loading
Loading