6
6
import { raceCancellationError } from '../../../base/common/async.js' ;
7
7
import { CancellationToken } from '../../../base/common/cancellation.js' ;
8
8
import { Emitter , Event } from '../../../base/common/event.js' ;
9
- import { Disposable , DisposableMap } from '../../../base/common/lifecycle.js' ;
9
+ import { Disposable , DisposableMap , DisposableStore , IDisposable } from '../../../base/common/lifecycle.js' ;
10
10
import { revive } from '../../../base/common/marshalling.js' ;
11
11
import { URI , UriComponents } from '../../../base/common/uri.js' ;
12
12
import { localize } from '../../../nls.js' ;
@@ -27,8 +27,11 @@ import { ExtHostChatSessionsShape, ExtHostContext, IChatProgressDto, MainContext
27
27
28
28
@extHostNamedCustomer ( MainContext . MainThreadChatSessions )
29
29
export class MainThreadChatSessions extends Disposable implements MainThreadChatSessionsShape {
30
- private readonly _itemProvidersRegistrations = this . _register ( new DisposableMap < number > ( ) ) ;
31
- private readonly _contentProvidersRegisterations = this . _register ( new DisposableMap < number > ( ) ) ;
30
+ private readonly _itemProvidersRegistrations = this . _register ( new DisposableMap < number , IDisposable & {
31
+ readonly provider : IChatSessionItemProvider ;
32
+ readonly onDidChangeItems : Emitter < void > ;
33
+ } > ( ) ) ;
34
+ private readonly _contentProvidersRegistrations = this . _register ( new DisposableMap < number > ( ) ) ;
32
35
33
36
// Store progress emitters for active sessions: key is `${handle}_${sessionId}_${requestId}`
34
37
private readonly _activeProgressEmitters = new Map < string , Emitter < IChatProgress [ ] > > ( ) ;
@@ -56,17 +59,25 @@ export class MainThreadChatSessions extends Disposable implements MainThreadChat
56
59
57
60
$registerChatSessionItemProvider ( handle : number , chatSessionType : string ) : void {
58
61
// Register the provider handle - this tracks that a provider exists
62
+ const disposables = new DisposableStore ( ) ;
63
+ const changeEmitter = disposables . add ( new Emitter < void > ( ) ) ;
64
+
59
65
const provider : IChatSessionItemProvider = {
60
66
chatSessionType,
67
+ onDidChangeChatSessionItems : changeEmitter . event ,
61
68
provideChatSessionItems : ( token ) => this . _provideChatSessionItems ( handle , token )
62
69
} ;
70
+ disposables . add ( this . _chatSessionsService . registerChatSessionItemProvider ( provider ) ) ;
63
71
64
- this . _itemProvidersRegistrations . set ( handle , this . _chatSessionsService . registerChatSessionItemProvider ( provider ) ) ;
72
+ this . _itemProvidersRegistrations . set ( handle , {
73
+ dispose : ( ) => disposables . dispose ( ) ,
74
+ provider,
75
+ onDidChangeItems : changeEmitter ,
76
+ } ) ;
65
77
}
66
78
67
- $onDidChangeChatSessionItems ( chatSessionType : string ) : void {
68
- // Notify the provider that its chat session items have changed
69
- this . _chatSessionsService . notifySessionItemsChange ( chatSessionType ) ;
79
+ $onDidChangeChatSessionItems ( handle : number ) : void {
80
+ this . _itemProvidersRegistrations . get ( handle ) ?. onDidChangeItems . fire ( ) ;
70
81
}
71
82
72
83
private async _provideChatSessionItems ( handle : number , token : CancellationToken ) : Promise < IChatSessionItem [ ] > {
@@ -171,15 +182,14 @@ export class MainThreadChatSessions extends Disposable implements MainThreadChat
171
182
172
183
$registerChatSessionContentProvider ( handle : number , chatSessionType : string ) : void {
173
184
const provider : IChatSessionContentProvider = {
174
- chatSessionType,
175
185
provideChatSessionContent : ( id , token ) => this . _provideChatSessionContent ( handle , id , token )
176
186
} ;
177
187
178
- this . _contentProvidersRegisterations . set ( handle , this . _chatSessionsService . registerChatSessionContentProvider ( provider ) ) ;
188
+ this . _contentProvidersRegistrations . set ( handle , this . _chatSessionsService . registerChatSessionContentProvider ( chatSessionType , provider ) ) ;
179
189
}
180
190
181
191
$unregisterChatSessionContentProvider ( handle : number ) : void {
182
- this . _contentProvidersRegisterations . deleteAndDispose ( handle ) ;
192
+ this . _contentProvidersRegistrations . deleteAndDispose ( handle ) ;
183
193
}
184
194
185
195
async $handleProgressChunk ( handle : number , sessionId : string , requestId : string , chunks : ( IChatProgressDto | [ IChatProgressDto , number ] ) [ ] ) : Promise < void > {
0 commit comments