1- import { Disposable , Webview , window , Uri } from "vscode" ;
1+ import { Disposable , Webview , Uri } from "vscode" ;
22import * as vscode from "vscode" ;
33import { getUri } from "../utils/getUri" ;
44import { getNonce } from "../utils/getNonce" ;
55import { chat } from "../chat" ;
6+ import { ChatMessage } from "../prompt/promptChat" ;
67
78export type MessageType =
89 | {
@@ -13,15 +14,16 @@ export type MessageType =
1314 }
1415 | {
1516 type : "e2w-response" ;
17+ id : string ;
1618 command : string ;
17- messageId : string ;
1819 done : boolean ;
1920 data : any ;
2021 } ;
2122
2223export class ChatPanel implements vscode . WebviewViewProvider {
2324 private disposables : Disposable [ ] = [ ] ;
2425 private webview : Webview | undefined ;
26+ private messageCallback : Record < string , any > = { } ;
2527
2628 constructor ( private readonly extensionUri : vscode . Uri ) { }
2729
@@ -94,26 +96,19 @@ export class ChatPanel implements vscode.WebviewViewProvider {
9496 private setWebviewMessageListener ( webview : Webview ) {
9597 webview . onDidReceiveMessage (
9698 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+ }
106103 const type = message . type ;
107- const data = message . data ;
108104
109105 switch ( type ) {
110106 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+ } ) ;
117112 return ;
118113 }
119114 } ,
@@ -122,6 +117,47 @@ export class ChatPanel implements vscode.WebviewViewProvider {
122117 ) ;
123118 }
124119
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+
125161 public async sendMessageToWebview (
126162 command : MessageType [ "command" ] ,
127163 data : MessageType [ "data" ]
0 commit comments