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
990f7e0
fix(mcp): resolve env vars in agent plugin MCP server definitions
ConsoleTVs Mar 19, 2026
61f2e55
Merge branch 'main' into fix/plugin-mcp-env-var-substitution
ConsoleTVs Mar 19, 2026
a9b9bb4
refactor(mcp): use cloneAndChange in convertBareEnvVarsToVsCodeSyntax
ConsoleTVs Mar 19, 2026
9eeb765
Merge remote-tracking branch 'upstream/main' into fix/plugin-mcp-env-…
ConsoleTVs Mar 19, 2026
5bff3c1
fix(mcp): preserve URI instances in cloneAndChange and update tests f…
ConsoleTVs Mar 19, 2026
604fe23
Revert "Add chat session header component and styles" (#304031)
sandy081 Mar 23, 2026
c0dfb08
Revert "Merge pull request #303499 from microsoft/mrleemurray/session…
mrleemurray Mar 23, 2026
e898258
Sessions: Enhance chat bar and title bar styling with borders (#304066)
mrleemurray Mar 23, 2026
9df8719
Merge branch 'main' into mrleemurray/revert-sessions-panel-animations
mrleemurray Mar 23, 2026
5e748c9
Support taskVar variables from problem matcher named capture groups
hediet Mar 20, 2026
13d5f73
Sessions: fix stale CI checks when switching active session (#304062)
benibenj Mar 23, 2026
7073d27
Fixes https://github.com/microsoft/vscode/issues/304047 (#304080)
hediet Mar 23, 2026
1954156
fiy chat overflow toolbar
benibenj Mar 23, 2026
b870c7b
fix test
benibenj Mar 23, 2026
f77788e
remove tests
benibenj Mar 23, 2026
38c26af
Merge pull request #303156 from ConsoleTVs/fix/plugin-mcp-env-var-sub…
connor4312 Mar 23, 2026
8fd03e3
Merge pull request #304083 from microsoft/benibenj/running-albatross
benibenj Mar 23, 2026
c8e82bf
Show static pinned icon on sessions list items that hides on hover (#…
benibenj Mar 23, 2026
86caa42
Merge pull request #304060 from microsoft/mrleemurray/revert-sessions…
mrleemurray Mar 23, 2026
ee7a0d3
Keyboard layout - replace all dashes/dots in macOS layout labels (#30…
xingsy97 Mar 23, 2026
dbe6a13
fix #304013 (#304105)
sandy081 Mar 23, 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: 2 additions & 2 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -660,7 +660,7 @@
"name": "Component Explorer (Edge)",
"type": "msedge",
"request": "launch",
"url": "http://localhost:5337/___explorer",
"url": "${taskVar:componentExplorerUrl}",
"preLaunchTask": "Launch Component Explorer",
"presentation": {
"group": "1_component_explorer",
Expand All @@ -671,7 +671,7 @@
"name": "Component Explorer (Chrome)",
"type": "chrome",
"request": "launch",
"url": "http://localhost:5337/___explorer",
"url": "${taskVar:componentExplorerUrl}",
"preLaunchTask": "Launch Component Explorer",
"presentation": {
"group": "1_component_explorer",
Expand Down
2 changes: 1 addition & 1 deletion .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@
"background": {
"activeOnStart": true,
"beginsPattern": ".*Setting up sessions.*",
"endsPattern": "Redirection server listening on.*"
"endsPattern": " current: (?<componentExplorerUrl>.*) \\(current\\)"
}
}
},
Expand Down
17 changes: 13 additions & 4 deletions src/vs/base/browser/ui/toolbar/toolbar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ export class ToolBar extends Disposable {
this.actionBar.push(action, { icon: this.options.icon ?? true, label: this.options.label ?? false, keybinding: this.getKeybindingLabel(action) });
});

this.actionBar.domNode.classList.toggle('has-overflow', this.actionBar.hasAction(this.toggleMenuAction));
this.updateOverflowClassName();

if (this.options.responsiveBehavior?.enabled) {
// Reset hidden actions
Expand Down Expand Up @@ -300,7 +300,8 @@ export class ToolBar extends Disposable {

// Ensure that the container width respects the minimum width of the
// element which is set based on the `responsiveBehavior.minItems` option
containerWidth = Math.max(containerWidth, parseInt(this.element.style.minWidth));
const parsedMinWidth = parseInt(this.element.style.minWidth);
containerWidth = Math.max(containerWidth, Number.isNaN(parsedMinWidth) ? 0 : parsedMinWidth);

// Each action is assumed to have a minimum width so that actions with a label
// can shrink to the action's minimum width. We do this so that action visibility
Expand All @@ -326,12 +327,14 @@ export class ToolBar extends Disposable {
}
};

const minimumWidth = actionBarWidth(false);

// Action bar fits and there are no hidden actions to show
if (actionBarWidth(false) <= containerWidth && this.hiddenActions.length === 0) {
if (minimumWidth <= containerWidth && this.hiddenActions.length === 0) {
return;
}

if (actionBarWidth(false) > containerWidth) {
if (minimumWidth > containerWidth) {
// Check for max items limit
if (this.options.responsiveBehavior?.minItems !== undefined) {
const primaryActionsCount = this.actionBar.hasAction(this.toggleMenuAction)
Expand Down Expand Up @@ -367,6 +370,7 @@ export class ToolBar extends Disposable {
label: this.options.label ?? false,
keybinding: this.getKeybindingLabel(this.toggleMenuAction),
});
this.updateOverflowClassName();
}
}
} else {
Expand All @@ -392,6 +396,7 @@ export class ToolBar extends Disposable {
if (this.originalSecondaryActions.length === 0 && this.hiddenActions.length === 0) {
this.toggleMenuAction.menuActions = [];
this.actionBar.pull(this.actionBar.length() - 1);
this.updateOverflowClassName();
}
}
}
Expand All @@ -403,6 +408,10 @@ export class ToolBar extends Disposable {
this.toggleMenuAction.menuActions = Separator.join(hiddenActions, secondaryActions);
}

this.updateOverflowClassName();
}

private updateOverflowClassName(): void {
this.actionBar.domNode.classList.toggle('has-overflow', this.actionBar.hasAction(this.toggleMenuAction));
}

Expand Down
1 change: 1 addition & 0 deletions src/vs/platform/actionWidget/browser/actionList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1234,6 +1234,7 @@ export class ActionListWidget<T> extends Disposable {
description: child.tooltip || undefined,
group: { title: '', icon: ThemeIcon.fromId(child.checked ? Codicon.check.id : Codicon.blank.id) },
hideIcon: false,
hover: {},
});
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/vs/platform/keyboardLayout/common/keyboardLayout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,13 @@ export function parseKeyboardLayoutDescription(layout: IKeyboardLayoutInfo | nul

if (/^com\.apple\.keylayout\./.test(macLayout.id)) {
return {
label: macLayout.id.replace(/^com\.apple\.keylayout\./, '').replace(/-/, ' '),
label: macLayout.id.replace(/^com\.apple\.keylayout\./, '').replace(/-/g, ' '),
description: ''
};
}
if (/^.*inputmethod\./.test(macLayout.id)) {
return {
label: macLayout.id.replace(/^.*inputmethod\./, '').replace(/[-\.]/, ' '),
label: macLayout.id.replace(/^.*inputmethod\./, '').replace(/[-\.]/g, ' '),
description: `Input Method (${macLayout.lang})`
};
}
Expand Down
56 changes: 10 additions & 46 deletions src/vs/sessions/browser/media/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -15,72 +15,36 @@
*
* Margin values (must match the constants in the Part classes):
* Sidebar: no card (flush, spans full height)
* Chat bar: top=16, bottom=2, left=16, right=16
* Auxiliary bar: top=16, bottom=18, right=16
* Panel: bottom=18, left=16, right=16
*/

.agent-sessions-workbench .part.sidebar {
background: var(--vscode-sideBar-background);
border-right: 1px solid var(--vscode-sideBar-border, transparent);
animation: sessions-card-enter-left 250ms cubic-bezier(0.0, 0.0, 0.2, 1) both;
}

.agent-sessions-workbench .part.chatbar {
margin: 0 16px 2px 16px;
background: var(--part-background);
border: 1px solid var(--part-border-color, transparent);
border-radius: 8px;
box-sizing: border-box;
}

.agent-sessions-workbench .part.auxiliarybar {
margin: 0 16px 2px 0;
background: var(--part-background);
border: 1px solid var(--part-border-color, transparent);
border-radius: 8px;
animation: sessions-card-enter-right 250ms cubic-bezier(0.0, 0.0, 0.2, 1) both;
}

.agent-sessions-workbench .part.panel {
margin: 0 16px 18px 16px;
background: var(--part-background);
border: 1px solid var(--part-border-color, transparent);
border-radius: 8px;
animation: sessions-card-enter-up 250ms cubic-bezier(0.0, 0.0, 0.2, 1) both;
}

/* Card entrance animations */
@keyframes sessions-card-enter-left {
from {
opacity: 0;
transform: translateX(-12px) scale(0.97);
}
to {
opacity: 1;
transform: translateX(0) scale(1);
}
}

@keyframes sessions-card-enter-right {
from {
opacity: 0;
transform: translateX(12px) scale(0.97);
}
to {
opacity: 1;
transform: translateX(0) scale(1);
}
}

@keyframes sessions-card-enter-up {
from {
opacity: 0;
transform: translateY(12px) scale(0.97);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}

@media (prefers-reduced-motion: reduce) {
.agent-sessions-workbench .part.sidebar,
.agent-sessions-workbench .part.auxiliarybar,
.agent-sessions-workbench .part.panel {
animation: none;
}
}

/* Grid background matches the chat bar / sidebar background */
Expand Down Expand Up @@ -124,7 +88,7 @@
margin: 0 auto !important;
display: inherit !important;
/* Align with panel (terminal) card margin */
padding: 4px 16px 16px 16px !important;
padding: 4px 16px !important;
box-sizing: border-box;
}

Expand Down
35 changes: 34 additions & 1 deletion src/vs/sessions/browser/parts/chatBarPart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@ import { INotificationService } from '../../../platform/notification/common/noti
import { IStorageService } from '../../../platform/storage/common/storage.js';
import { IThemeService } from '../../../platform/theme/common/themeService.js';
import { ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_DRAG_AND_DROP_BORDER, PANEL_INACTIVE_TITLE_FOREGROUND, SIDE_BAR_BACKGROUND, SIDE_BAR_TITLE_BORDER, SIDE_BAR_FOREGROUND } from '../../../workbench/common/theme.js';
import { contrastBorder } from '../../../platform/theme/common/colorRegistry.js';
import { sessionsSidebarBorder } from '../../common/theme.js';
import { IViewDescriptorService, ViewContainerLocation } from '../../../workbench/common/views.js';
import { IExtensionService } from '../../../workbench/services/extensions/common/extensions.js';
import { IWorkbenchLayoutService, Parts } from '../../../workbench/services/layout/browser/layoutService.js';
import { HoverPosition } from '../../../base/browser/ui/hover/hoverWidget.js';
import { assertReturnsDefined } from '../../../base/common/types.js';
import { LayoutPriority } from '../../../base/browser/ui/splitview/splitview.js';
import { AbstractPaneCompositePart, CompositeBarPosition } from '../../../workbench/browser/parts/paneCompositePart.js';
import { Part } from '../../../workbench/browser/part.js';
import { ActionsOrientation } from '../../../base/browser/ui/actionbar/actionbar.js';
import { IPaneCompositeBarOptions } from '../../../workbench/browser/parts/paneCompositeBar.js';
import { IMenuService } from '../../../platform/actions/common/actions.js';
Expand All @@ -39,6 +42,15 @@ export class ChatBarPart extends AbstractPaneCompositePart {
override readonly minimumHeight: number = 0;
override readonly maximumHeight: number = Number.POSITIVE_INFINITY;

/** Visual margin values for the card-like appearance */
static readonly MARGIN_TOP = 16;
static readonly MARGIN_LEFT = 16;
static readonly MARGIN_RIGHT = 16;
static readonly MARGIN_BOTTOM = 2;

/** Border width on the card (1px each side) */
static readonly BORDER_WIDTH = 1;

get preferredHeight(): number | undefined {
return this.layoutService.mainContainerDimension.height * 0.4;
}
Expand Down Expand Up @@ -96,10 +108,31 @@ export class ChatBarPart extends AbstractPaneCompositePart {
super.updateStyles();

const container = assertReturnsDefined(this.getContainer());
container.style.backgroundColor = this.getColor(SIDE_BAR_BACKGROUND) || '';

// Store background and border as CSS variables for the card styling on .part
container.style.setProperty('--part-background', this.getColor(SIDE_BAR_BACKGROUND) || '');
container.style.setProperty('--part-border-color', this.getColor(sessionsSidebarBorder) || this.getColor(contrastBorder) || 'transparent');
container.style.backgroundColor = 'transparent';
container.style.color = this.getColor(SIDE_BAR_FOREGROUND) || '';
}

override layout(width: number, height: number, top: number, left: number): void {
if (!this.layoutService.isVisible(Parts.CHATBAR_PART)) {
return;
}

// Layout content with reduced dimensions to account for visual margins and border
const borderTotal = ChatBarPart.BORDER_WIDTH * 2;
super.layout(
width - ChatBarPart.MARGIN_LEFT - ChatBarPart.MARGIN_RIGHT - borderTotal,
height - ChatBarPart.MARGIN_TOP - ChatBarPart.MARGIN_BOTTOM - borderTotal,
top, left
);

// Restore the full grid-allocated dimensions so that Part.relayout() works correctly.
Part.prototype.layout.call(this, width, height, top, left);
}

protected getCompositeBarOptions(): IPaneCompositeBarOptions {
return {
partContainerClass: 'chatbar',
Expand Down
2 changes: 1 addition & 1 deletion src/vs/sessions/browser/parts/media/titlebarpart.css
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
width: fit-content;
flex-grow: 0;
justify-content: flex-end;
margin-right: 10px;
margin-right: 12px;
}

/* Session Title Actions Container (before right toolbar) */
Expand Down
11 changes: 7 additions & 4 deletions src/vs/sessions/contrib/changes/browser/changesView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -903,6 +903,7 @@ export class ChangesViewPane extends ViewPane {
// Bind CI status widget to active session's PR CI model
if (this.ciStatusWidget) {
const activeSessionResourceObs = derived(this, reader => this.sessionManagementService.activeSession.read(reader)?.resource);

const ciModelObs = derived(this, reader => {
const session = this.sessionManagementService.activeSession.read(reader);
if (!session) {
Expand All @@ -912,16 +913,18 @@ export class ChangesViewPane extends ViewPane {
if (!context || context.prNumber === undefined) {
return undefined;
}
// Use the PR's headRef from the PR model to get CI checks
const prModel = this.gitHubService.getPullRequest(context.owner, context.repo, context.prNumber);
const pr = prModel.pullRequest.read(reader);
if (!pr) {
// Trigger a refresh if PR data isn't loaded yet
prModel.refresh();
return undefined;
}
const ciModel = this.gitHubService.getPullRequestCI(context.owner, context.repo, pr.headRef);
// Use the PR's headSha (commit SHA) rather than the branch
// name so CI checks can still be fetched after branch deletion
// (e.g. after the PR is merged).
const ciModel = this.gitHubService.getPullRequestCI(context.owner, context.repo, pr.headSha);
ciModel.refresh();
ciModel.startPolling();
reader.store.add({ dispose: () => ciModel.stopPolling() });
return ciModel;
});
this.renderDisposables.add(this.ciStatusWidget.bind(ciModelObs, activeSessionResourceObs));
Expand Down
Loading
Loading