Skip to content

Commit d7ac7f7

Browse files
authored
Merge pull request microsoft#257579 from microsoft/osortega/adding-chat-session-change-event
Adding event for chat session items changes
2 parents c10aee1 + 79b78d6 commit d7ac7f7

File tree

5 files changed

+45
-1
lines changed

5 files changed

+45
-1
lines changed

src/vs/workbench/api/browser/mainThreadChatSessions.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ export class MainThreadChatSessions extends Disposable implements MainThreadChat
3333
this._registrations.set(handle, this._chatSessionsService.registerChatSessionItemProvider(provider));
3434
}
3535

36+
$onDidChangeChatSessionItems(chatSessionType: string): void {
37+
// Notify the provider that its chat session items have changed
38+
this._chatSessionsService.notifySessionItemsChange(chatSessionType);
39+
}
40+
3641
private async _provideChatSessionItems(handle: number, token: CancellationToken): Promise<IChatSessionItem[]> {
3742
const proxy = this._extHostContext.getProxy(ExtHostContext.ExtHostChatSessions);
3843

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3113,6 +3113,7 @@ export interface MainThreadChatStatusShape {
31133113
export interface MainThreadChatSessionsShape extends IDisposable {
31143114
$registerChatSessionItemProvider(handle: number, chatSessionType: string, label: string): void;
31153115
$unregisterChatSessionItemProvider(handle: number): void;
3116+
$onDidChangeChatSessionItems(chatSessionType: string): void;
31163117
}
31173118

31183119
export interface ExtHostChatSessionsShape {

src/vs/workbench/api/common/extHostChatSessions.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ export class ExtHostChatSessions extends Disposable implements ExtHostChatSessio
5353

5454
this._statusProviders.set(handle, { provider, disposable: disposables });
5555
this._proxy.$registerChatSessionItemProvider(handle, chatSessionType, provider.label);
56-
56+
if (provider.onDidChangeChatSessionItems) {
57+
disposables.add(provider.onDidChangeChatSessionItems(() => {
58+
this._proxy.$onDidChangeChatSessionItems(chatSessionType);
59+
}));
60+
}
5761
return {
5862
dispose: () => {
5963
this._statusProviders.delete(handle);

src/vs/workbench/contrib/chat/browser/chatSessions.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,10 @@ class ChatSessionsViewPaneContainer extends ViewPaneContainer {
367367
this.updateViewRegistration();
368368
}));
369369

370+
// Listen for session items changes and refresh the appropriate provider tree
371+
this._register(this.chatSessionsService.onDidChangeSessionItems((chatSessionType) => {
372+
this.refreshProviderTree(chatSessionType);
373+
}));
370374
}
371375

372376
override getTitle(): string {
@@ -382,6 +386,21 @@ class ChatSessionsViewPaneContainer extends ViewPaneContainer {
382386
}
383387
}
384388

389+
private refreshProviderTree(chatSessionType: string): void {
390+
// Find the provider with the matching chatSessionType
391+
const providers = this.getAllChatSessionProviders();
392+
const targetProvider = providers.find(provider => provider.chatSessionType === chatSessionType);
393+
394+
if (targetProvider) {
395+
// Find the corresponding view and refresh its tree
396+
const viewId = `${VIEWLET_ID}.${chatSessionType}`;
397+
const view = this.getView(viewId) as SessionsViewPane | undefined;
398+
if (view) {
399+
view.refreshTree();
400+
}
401+
}
402+
}
403+
385404
private updateViewRegistration(): void {
386405
const currentProviders = this.getAllChatSessionProviders();
387406
const currentProviderIds = new Set(currentProviders.map(p => p.chatSessionType));
@@ -601,6 +620,12 @@ class SessionsViewPane extends ViewPane {
601620
return ('editor' in item && 'group' in item) || ('widget' in item && 'sessionType' in item);
602621
}
603622

623+
public refreshTree(): void {
624+
if (this.tree && this.isBodyVisible()) {
625+
this.tree.updateChildren(this.provider);
626+
}
627+
}
628+
604629
protected override renderBody(container: HTMLElement): void {
605630
super.renderBody(container);
606631

src/vs/workbench/contrib/chat/common/chatSessionsService.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@ export interface IChatSessionItemProvider {
3939
export interface IChatSessionsService {
4040
readonly _serviceBrand: undefined;
4141
readonly onDidChangeItemsProviders: Event<IChatSessionItemProvider>;
42+
readonly onDidChangeSessionItems: Event<string>;
4243
registerContribution(contribution: IChatSessionsExtensionPoint): IDisposable;
4344
getChatSessionProviders(): IChatSessionsExtensionPoint[];
4445
getChatSessionItemProviders(): IChatSessionItemProvider[];
4546
registerChatSessionItemProvider(provider: IChatSessionItemProvider): IDisposable;
4647
hasChatSessionItemProviders: boolean;
4748
provideChatSessionItems(chatSessionType: string, token: CancellationToken): Promise<IChatSessionItem[]>;
49+
notifySessionItemsChange(chatSessionType: string): void;
4850
}
4951

5052
export const IChatSessionsService = createDecorator<IChatSessionsService>('chatSessionsService');
@@ -55,6 +57,9 @@ export class ChatSessionsService extends Disposable implements IChatSessionsServ
5557

5658
private readonly _onDidChangeItemsProviders = this._register(new Emitter<IChatSessionItemProvider>());
5759
readonly onDidChangeItemsProviders: Event<IChatSessionItemProvider> = this._onDidChangeItemsProviders.event;
60+
private readonly _onDidChangeSessionItems = this._register(new Emitter<string>());
61+
readonly onDidChangeSessionItems: Event<string> = this._onDidChangeSessionItems.event;
62+
5863
private _contributions: Map<string, IChatSessionsExtensionPoint> = new Map();
5964

6065
constructor(
@@ -98,6 +103,10 @@ export class ChatSessionsService extends Disposable implements IChatSessionsServ
98103
return this._itemsProviders.has(chatViewType);
99104
}
100105

106+
public notifySessionItemsChange(chatSessionType: string): void {
107+
this._onDidChangeSessionItems.fire(chatSessionType);
108+
}
109+
101110
public async provideChatSessionItems(chatSessionType: string, token: CancellationToken): Promise<IChatSessionItem[]> {
102111
if (!(await this.canResolve(chatSessionType))) {
103112
throw Error(`Can not find provider for ${chatSessionType}`);

0 commit comments

Comments
 (0)