@@ -3,7 +3,8 @@ 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
+ import { Chat , ChatMessage } from "../prompt/promptChat" ;
7
+ import { state } from "../utils/state" ;
7
8
8
9
export type MessageType =
9
10
| {
@@ -15,11 +16,43 @@ export type MessageType =
15
16
| {
16
17
type : "e2w-response" ;
17
18
id : string ;
18
- command : string ;
19
19
done : boolean ;
20
20
data : any ;
21
21
} ;
22
22
23
+ type MessageToExtention =
24
+ | {
25
+ type : "send-message" ;
26
+ data : ChatMessage [ ] ;
27
+ }
28
+ | {
29
+ type : "abort-generate" ;
30
+ id : string ;
31
+ }
32
+ | {
33
+ type : "get-chat" ;
34
+ chatId : string ;
35
+ }
36
+ | {
37
+ type : "save-chat" ;
38
+ chatId : string ;
39
+ data : Chat ;
40
+ }
41
+ | {
42
+ type : "get-chats" ;
43
+ }
44
+ | {
45
+ type : "delete-chat" ;
46
+ chatId : string ;
47
+ }
48
+ | {
49
+ type : "delete-chats" ;
50
+ } ;
51
+
52
+ type MessageFromWebview = MessageToExtention & {
53
+ id : string ;
54
+ } ;
55
+
23
56
export class ChatPanel implements vscode . WebviewViewProvider {
24
57
private disposables : Disposable [ ] = [ ] ;
25
58
private webview : Webview | undefined ;
@@ -50,6 +83,7 @@ export class ChatPanel implements vscode.WebviewViewProvider {
50
83
"css" ,
51
84
"main.css" ,
52
85
] ) ;
86
+
53
87
const scriptUri = getUri ( webview , extensionUri , [
54
88
"webviews" ,
55
89
"build" ,
@@ -95,49 +129,70 @@ export class ChatPanel implements vscode.WebviewViewProvider {
95
129
96
130
private setWebviewMessageListener ( webview : Webview ) {
97
131
webview . onDidReceiveMessage (
98
- async ( message : any ) => {
132
+ async ( message : MessageFromWebview ) => {
99
133
if ( message . type in this . messageCallback ) {
100
134
this . messageCallback [ message . type ] ( ) ;
101
135
return ;
102
136
}
137
+
103
138
const type = message . type ;
104
139
105
140
switch ( type ) {
106
- case "sendMessage " :
141
+ case "send-message " :
107
142
await this . handleStartGeneration ( {
143
+ id : message . id ,
108
144
chatMessage : message . data ,
109
- messageId : message . messageId ,
110
- messageType : message . type ,
111
145
} ) ;
112
- return ;
146
+ break ;
147
+ case "get-chat" :
148
+ await this . handleGetChat ( {
149
+ id : message . id ,
150
+ chatId : message . chatId ,
151
+ } ) ;
152
+ break ;
153
+ case "save-chat" :
154
+ await this . handleSaveChat ( {
155
+ id : message . id ,
156
+ chatId : message . chatId ,
157
+ history : message . data ,
158
+ } ) ;
159
+ break ;
160
+ case "delete-chat" :
161
+ await this . handleDeleteChat ( {
162
+ id : message . id ,
163
+ chatId : message . chatId ,
164
+ } ) ;
165
+ break ;
166
+ case "delete-chats" :
167
+ await this . handleDeleteChats ( {
168
+ id : message . id ,
169
+ } ) ;
170
+ break ;
171
+ case "get-chats" :
172
+ await this . handleGetChats ( {
173
+ id : message . id ,
174
+ } ) ;
175
+ break ;
176
+ default :
177
+ break ;
113
178
}
114
179
} ,
115
180
undefined ,
116
181
this . disposables
117
182
) ;
118
183
}
119
184
120
- private addMessageListener (
121
- commandOrMessageId : string ,
122
- callback : ( message : any ) => void
123
- ) {
124
- this . messageCallback [ commandOrMessageId ] = callback ;
125
- }
126
-
127
185
private async handleStartGeneration ( {
128
- messageId,
129
- messageType,
186
+ id,
130
187
chatMessage,
131
188
} : {
132
- messageId : string ;
133
- messageType : string ;
189
+ id : string ;
134
190
chatMessage : ChatMessage [ ] ;
135
191
} ) {
136
- const sendResponse = ( messageToResponse : any , done : boolean ) => {
192
+ const sendResponse = ( messageToResponse : string , done : boolean ) => {
137
193
this . postMessage ( {
138
194
type : "e2w-response" ,
139
- id : messageId ,
140
- command : messageType ,
195
+ id : id ,
141
196
data : messageToResponse ,
142
197
done : done ,
143
198
} ) ;
@@ -158,8 +213,91 @@ export class ChatPanel implements vscode.WebviewViewProvider {
158
213
sendResponse ( "" , true ) ;
159
214
}
160
215
216
+ private async handleGetChat ( { chatId, id } : { chatId : string ; id : string } ) {
217
+ const sendResponse = ( messageToResponse : Chat | null , done : boolean ) => {
218
+ this . postMessage ( {
219
+ type : "e2w-response" ,
220
+ id : id ,
221
+ data : messageToResponse ,
222
+ done : done ,
223
+ } ) ;
224
+ } ;
225
+
226
+ const history = state . global . get ( `chat-${ chatId } ` ) ;
227
+ if ( history ) {
228
+ sendResponse ( history , true ) ;
229
+ } else {
230
+ sendResponse ( null , true ) ;
231
+ }
232
+ }
233
+
234
+ private async handleSaveChat ( {
235
+ chatId,
236
+ history,
237
+ id,
238
+ } : {
239
+ chatId : string ;
240
+ history : Chat ;
241
+ id : string ;
242
+ } ) {
243
+ await state . global . update ( `chat-${ chatId } ` , history ) ;
244
+ await this . postMessage ( {
245
+ type : "e2w-response" ,
246
+ id : id ,
247
+ data : "" ,
248
+ done : true ,
249
+ } ) ;
250
+ }
251
+
252
+ private async handleDeleteChat ( {
253
+ chatId,
254
+ id,
255
+ } : {
256
+ chatId : string ;
257
+ id : string ;
258
+ } ) {
259
+ await state . global . delete ( `chat-${ chatId } ` ) ;
260
+ await this . postMessage ( {
261
+ type : "e2w-response" ,
262
+ id : id ,
263
+ data : "" ,
264
+ done : true ,
265
+ } ) ;
266
+ }
267
+
268
+ private async handleDeleteChats ( { id } : { id : string } ) {
269
+ await state . global . deleteChats ( ) ;
270
+ await this . postMessage ( {
271
+ type : "e2w-response" ,
272
+ id : id ,
273
+ data : "" ,
274
+ done : true ,
275
+ } ) ;
276
+ }
277
+
278
+ private async handleGetChats ( { id } : { id : string } ) {
279
+ const chats = state . global . getChats ( ) ;
280
+ await this . postMessage ( {
281
+ type : "e2w-response" ,
282
+ id : id ,
283
+ data : chats ,
284
+ done : true ,
285
+ } ) ;
286
+ }
287
+
288
+ private addMessageListener (
289
+ commandOrMessageId : string ,
290
+ callback : ( message : any ) => void
291
+ ) {
292
+ this . messageCallback [ commandOrMessageId ] = callback ;
293
+ }
294
+
295
+ private async postMessage ( message : MessageType ) {
296
+ await this . webview ?. postMessage ( message ) ;
297
+ }
298
+
161
299
public async sendMessageToWebview (
162
- command : MessageType [ "command" ] ,
300
+ command : string ,
163
301
data : MessageType [ "data" ]
164
302
) {
165
303
const message : MessageType = {
@@ -170,8 +308,4 @@ export class ChatPanel implements vscode.WebviewViewProvider {
170
308
} ;
171
309
await this . postMessage ( message ) ;
172
310
}
173
-
174
- private async postMessage ( message : MessageType ) {
175
- await this . webview ?. postMessage ( message ) ;
176
- }
177
311
}
0 commit comments