1
- import { Disposable , Webview , window , Uri } from "vscode" ;
1
+ import { Disposable , Webview , Uri } from "vscode" ;
2
2
import * as vscode from "vscode" ;
3
3
import { getUri } from "../utils/getUri" ;
4
4
import { getNonce } from "../utils/getNonce" ;
5
5
import { chat } from "../chat" ;
6
+ import { ChatMessage } from "../prompt/promptChat" ;
6
7
7
8
export type MessageType =
8
9
| {
@@ -13,15 +14,16 @@ export type MessageType =
13
14
}
14
15
| {
15
16
type : "e2w-response" ;
17
+ id : string ;
16
18
command : string ;
17
- messageId : string ;
18
19
done : boolean ;
19
20
data : any ;
20
21
} ;
21
22
22
23
export class ChatPanel implements vscode . WebviewViewProvider {
23
24
private disposables : Disposable [ ] = [ ] ;
24
25
private webview : Webview | undefined ;
26
+ private messageCallback : Record < string , any > = { } ;
25
27
26
28
constructor ( private readonly extensionUri : vscode . Uri ) { }
27
29
@@ -94,26 +96,19 @@ export class ChatPanel implements vscode.WebviewViewProvider {
94
96
private setWebviewMessageListener ( webview : Webview ) {
95
97
webview . onDidReceiveMessage (
96
98
async ( message : any ) => {
97
- const sendResponse = ( messageToResponse : any , done : boolean ) => {
98
- this . postMessage ( {
99
- type : "e2w-response" ,
100
- command : message . type ,
101
- messageId : message . messageId ,
102
- data : messageToResponse ,
103
- done : done ,
104
- } ) ;
105
- } ;
99
+ if ( message . type in this . messageCallback ) {
100
+ this . messageCallback [ message . type ] ( ) ;
101
+ return ;
102
+ }
106
103
const type = message . type ;
107
- const data = message . data ;
108
104
109
105
switch ( type ) {
110
106
case "sendMessage" :
111
- for await ( const message of chat ( data , {
112
- provideHighlightedText : true ,
113
- } ) ) {
114
- sendResponse ( message , false ) ;
115
- }
116
- sendResponse ( "" , true ) ;
107
+ await this . handleStartGeneration ( {
108
+ chatMessage : message . data ,
109
+ messageId : message . messageId ,
110
+ messageType : message . type ,
111
+ } ) ;
117
112
return ;
118
113
}
119
114
} ,
@@ -122,6 +117,47 @@ export class ChatPanel implements vscode.WebviewViewProvider {
122
117
) ;
123
118
}
124
119
120
+ private addMessageListener (
121
+ commandOrMessageId : string ,
122
+ callback : ( message : any ) => void
123
+ ) {
124
+ this . messageCallback [ commandOrMessageId ] = callback ;
125
+ }
126
+
127
+ private async handleStartGeneration ( {
128
+ messageId,
129
+ messageType,
130
+ chatMessage,
131
+ } : {
132
+ messageId : string ;
133
+ messageType : string ;
134
+ chatMessage : ChatMessage [ ] ;
135
+ } ) {
136
+ const sendResponse = ( messageToResponse : any , done : boolean ) => {
137
+ this . postMessage ( {
138
+ type : "e2w-response" ,
139
+ id : messageId ,
140
+ command : messageType ,
141
+ data : messageToResponse ,
142
+ done : done ,
143
+ } ) ;
144
+ } ;
145
+ const abortController = new AbortController ( ) ;
146
+
147
+ this . addMessageListener ( "abort-generate" , ( ) => {
148
+ abortController . abort ( ) ;
149
+ } ) ;
150
+
151
+ for await ( const message of chat ( chatMessage , {
152
+ provideHighlightedText : true ,
153
+ abortController,
154
+ } ) ) {
155
+ sendResponse ( message , false ) ;
156
+ }
157
+
158
+ sendResponse ( "" , true ) ;
159
+ }
160
+
125
161
public async sendMessageToWebview (
126
162
command : MessageType [ "command" ] ,
127
163
data : MessageType [ "data" ]
0 commit comments