1+ import ChatService
12import CopilotModel
23import CopilotService
34import Environment
@@ -54,14 +55,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
5455 )
5556
5657 if let suggestion = filespace. presentingSuggestion {
57- presenter. presentSuggestion (
58- suggestion,
59- lines: editor. lines,
60- language: filespace. language,
61- fileURL: fileURL,
62- currentSuggestionIndex: filespace. suggestionIndex,
63- suggestionCount: filespace. suggestions. count
64- )
58+ presenter. presentSuggestion ( fileURL: fileURL)
6559 } else {
6660 presenter. discardSuggestion ( fileURL: fileURL)
6761 }
@@ -87,14 +81,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
8781 workspace. selectNextSuggestion ( forFileAt: fileURL)
8882
8983 if let suggestion = filespace. presentingSuggestion {
90- presenter. presentSuggestion (
91- suggestion,
92- lines: editor. lines,
93- language: filespace. language,
94- fileURL: fileURL,
95- currentSuggestionIndex: filespace. suggestionIndex,
96- suggestionCount: filespace. suggestions. count
97- )
84+ presenter. presentSuggestion ( fileURL: fileURL)
9885 } else {
9986 presenter. discardSuggestion ( fileURL: fileURL)
10087 }
@@ -120,14 +107,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
120107 workspace. selectPreviousSuggestion ( forFileAt: fileURL)
121108
122109 if let suggestion = filespace. presentingSuggestion {
123- presenter. presentSuggestion (
124- suggestion,
125- lines: editor. lines,
126- language: filespace. language,
127- fileURL: fileURL,
128- currentSuggestionIndex: filespace. suggestionIndex,
129- suggestionCount: filespace. suggestions. count
130- )
110+ presenter. presentSuggestion ( fileURL: fileURL)
131111 } else {
132112 presenter. discardSuggestion ( fileURL: fileURL)
133113 }
@@ -208,27 +188,27 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
208188 defer { presenter. markAsProcessing ( false ) }
209189
210190 let fileURL = try await Environment . fetchCurrentFileURL ( )
191+ let ( _, filespace) = try await Workspace
192+ . fetchOrCreateWorkspaceIfNeeded ( fileURL: fileURL)
211193 let endpoint = UserDefaults . shared. value ( for: \. chatGPTEndpoint)
212194 let model = UserDefaults . shared. value ( for: \. chatGPTModel)
213195 let language = UserDefaults . shared. value ( for: \. chatGPTLanguage)
214196 let codeLanguage = languageIdentifierFromFileURL ( fileURL)
215197 guard let selection = editor. selections. last else { return }
216198
217- let service = ChatGPTService (
218- systemPrompt: """
199+ let chat = filespace. chatService ?? ChatService ( chatGPTService: ChatGPTService ( ) )
200+ filespace. chatService = chat
201+
202+ await chat. mutateSystemPrompt (
203+ """
219204 \( language. isEmpty ? " " : " You must always reply in \( language) " )
220205 You are a code explanation engine, you can only explain the code concisely, do not interpret or translate it.
221- """ ,
222- apiKey: UserDefaults . shared. value ( for: \. openAIAPIKey) ,
223- endpoint: endpoint. isEmpty ? nil : endpoint,
224- model: model. isEmpty ? nil : model,
225- temperature: 1 ,
226- maxToken: UserDefaults . shared. value ( for: \. chatGPTMaxToken)
206+ """
227207 )
228208
229209 let code = editor. selectedCode ( in: selection)
230210 Task {
231- try ? await service . send (
211+ try ? await chat . chatGPTService . send (
232212 content: """
233213 ``` \( codeLanguage. rawValue)
234214 \( removeContinuousSpaces ( from: code) )
@@ -238,7 +218,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
238218 )
239219 }
240220
241- presenter. presentChatGPTConversation ( service , fileURL: fileURL)
221+ presenter. presentChatGPTConversation ( fileURL: fileURL)
242222 }
243223
244224 func chatWithSelection( editor: EditorContent ) async throws -> UpdatedContent ? {
@@ -257,6 +237,8 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
257237 defer { presenter. markAsProcessing ( false ) }
258238
259239 let fileURL = try await Environment . fetchCurrentFileURL ( )
240+ let ( _, filespace) = try await Workspace
241+ . fetchOrCreateWorkspaceIfNeeded ( fileURL: fileURL)
260242 let endpoint = UserDefaults . shared. value ( for: \. chatGPTEndpoint)
261243 let model = UserDefaults . shared. value ( for: \. chatGPTModel)
262244 let language = UserDefaults . shared. value ( for: \. chatGPTLanguage)
@@ -284,18 +266,14 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
284266 """
285267 } ( )
286268
287- let service = ChatGPTService (
288- systemPrompt: prompt,
289- apiKey: UserDefaults . shared. value ( for: \. openAIAPIKey) ,
290- endpoint: endpoint. isEmpty ? nil : endpoint,
291- model: model. isEmpty ? nil : model,
292- temperature: 1 ,
293- maxToken: UserDefaults . shared. value ( for: \. chatGPTMaxToken)
294- )
269+ let chat = filespace. chatService ?? ChatService ( chatGPTService: ChatGPTService ( ) )
270+ filespace. chatService = chat
271+
272+ await chat. mutateSystemPrompt ( prompt)
295273
296274 Task {
297275 if !code. isEmpty, let selection = editor. selections. last {
298- await service . mutateHistory { history in
276+ await chat . chatGPTService . mutateHistory { history in
299277 history. append ( . init(
300278 role: . user,
301279 content: " " ,
@@ -305,7 +283,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
305283 }
306284 }
307285
308- presenter. presentChatGPTConversation ( service , fileURL: fileURL)
286+ presenter. presentChatGPTConversation ( fileURL: fileURL)
309287 }
310288}
311289
0 commit comments