Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ export class AgentSessionsControl extends Disposable {
private createList(container: HTMLElement): void {
this.sessionsContainer = append(container, $('.agent-sessions-viewer'));

const sorter = new AgentSessionsSorter();
const list = this.sessionsList = this._register(this.instantiationService.createInstance(WorkbenchCompressibleAsyncDataTree,
'AgentSessionsView',
this.sessionsContainer,
Expand All @@ -75,7 +76,7 @@ export class AgentSessionsControl extends Disposable {
[
this.instantiationService.createInstance(AgentSessionRenderer)
],
new AgentSessionsDataSource(this.options?.filter),
new AgentSessionsDataSource(this.options?.filter, sorter),
{
accessibilityProvider: new AgentSessionsAccessibilityProvider(),
dnd: this.instantiationService.createInstance(AgentSessionsDragAndDrop),
Expand All @@ -85,7 +86,7 @@ export class AgentSessionsControl extends Disposable {
findWidgetEnabled: true,
defaultFindMode: TreeFindMode.Filter,
keyboardNavigationLabelProvider: new AgentSessionsKeyboardNavigationLabelProvider(),
sorter: this.instantiationService.createInstance(AgentSessionsSorter),
sorter,
paddingBottom: this.options?.allowNewSessionFromEmptySpace ? AgentSessionsListDelegate.ITEM_HEIGHT : undefined,
twistieAdditionalCssClass: () => 'force-no-twistie',
}
Expand Down Expand Up @@ -203,4 +204,9 @@ export class AgentSessionsControl extends Disposable {
this.sessionsList.domFocus();
}
}

clearFocus(): void {
this.sessionsList?.setFocus([]);
this.sessionsList?.setSelection([]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -321,13 +321,19 @@ export interface IAgentSessionsFilter {

readonly onDidChange: Event<void>;

/**
* Optional limit on the number of sessions to show.
*/
readonly limitResults?: number;

exclude(session: IAgentSession): boolean;
}

export class AgentSessionsDataSource implements IAsyncDataSource<IAgentSessionsModel, IAgentSession> {

constructor(
private readonly filter: IAgentSessionsFilter | undefined
private readonly filter: IAgentSessionsFilter | undefined,
private readonly sorter: ITreeSorter<IAgentSession>,
) { }

hasChildren(element: IAgentSessionsModel | IAgentSession): boolean {
Expand All @@ -339,7 +345,16 @@ export class AgentSessionsDataSource implements IAsyncDataSource<IAgentSessionsM
return [];
}

return element.sessions.filter(session => !this.filter?.exclude(session));
// Apply filter if configured
const filteredSessions = element.sessions.filter(session => !this.filter?.exclude(session));

// Apply limiter if configured
if (this.filter?.limitResults !== undefined) {
filteredSessions.sort(this.sorter.compare.bind(this.sorter));
return filteredSessions.slice(0, this.filter.limitResults);
}

return filteredSessions;
}
}

Expand Down
10 changes: 9 additions & 1 deletion src/vs/workbench/contrib/chat/browser/chatViewPane.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,10 @@ export class ChatViewPane extends ViewPane implements IViewWelcomeDelegate {
this.createChatWidget(parent, welcomeController);

// Sessions control visibility is impacted by chat widget empty state
this._register(this._widget.onDidChangeEmptyState(() => this.updateSessionsControlVisibility(true)));
this._register(this._widget.onDidChangeEmptyState(() => {
this.sessionsControl?.clearFocus();
this.updateSessionsControlVisibility(true);
}));
}

private createSessionsControl(parent: HTMLElement): void {
Expand All @@ -262,7 +265,12 @@ export class ChatViewPane extends ViewPane implements IViewWelcomeDelegate {
allowOpenSessionsInPanel: true,
filter: {
onDidChange: Event.None,
limitResults: 3, // Limit to 3 sessions
exclude(session) {
if (session.isArchived()) {
return true; // exclude archived sessions
}

const model = that.chatService.getSession(session.resource);
if (model && !model.hasRequests) {
return true; // exclude sessions without requests
Expand Down
6 changes: 4 additions & 2 deletions src/vs/workbench/contrib/chat/browser/media/chatViewPane.css
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@
.agent-sessions-container {
display: flex;
flex-direction: column;
flex-grow: 1;
padding: 4px 8px;

.agent-sessions-viewer {
height: calc(3 * 44px); /* TODO@bpasero revisit: show at most 3 sessions */
.agent-sessions-viewer .monaco-list .monaco-list-row {
border-radius: 3px;
}

.agent-sessions-link-container {
Expand Down
Loading