Skip to content

Commit 450a9b6

Browse files
committed
Update command handler to present with data source
1 parent 4c39ad0 commit 450a9b6

2 files changed

Lines changed: 26 additions & 107 deletions

File tree

Core/Sources/Service/SuggestionCommandHandler/WindowBaseCommandHandler.swift

Lines changed: 22 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import ChatService
12
import CopilotModel
23
import CopilotService
34
import 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

Core/Sources/Service/SuggestionPresenter/PresentInWindowSuggestionPresenter.swift

Lines changed: 4 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,10 @@ import OpenAIService
55
import SuggestionWidget
66

77
struct PresentInWindowSuggestionPresenter {
8-
func presentSuggestion(
9-
_ suggestion: CopilotCompletion,
10-
lines: [String],
11-
language: String,
12-
fileURL: URL,
13-
currentSuggestionIndex: Int,
14-
suggestionCount: Int
15-
) {
8+
func presentSuggestion(fileURL: URL) {
169
Task { @MainActor in
1710
let controller = GraphicalUserInterfaceController.shared.suggestionWidget
18-
controller.suggestCode(
19-
suggestion.text,
20-
language: language,
21-
startLineIndex: suggestion.position.line,
22-
fileURL: fileURL,
23-
currentSuggestionIndex: currentSuggestionIndex,
24-
suggestionCount: suggestionCount
25-
)
11+
controller.suggestCode(fileURL: fileURL)
2612
}
2713
}
2814

@@ -62,55 +48,10 @@ struct PresentInWindowSuggestionPresenter {
6248
}
6349
}
6450

65-
func presentChatGPTConversation(_ service: ChatGPTService, fileURL: URL) {
66-
let chatRoom = ChatRoom()
67-
let chatService = ChatService(chatGPTService: service)
68-
let cancellable = service.objectWillChange.sink { [weak chatRoom] in
69-
guard let chatRoom else { return }
70-
Task { @MainActor in
71-
chatRoom.history = (await service.history).map { message in
72-
.init(
73-
id: message.id,
74-
isUser: message.role == .user,
75-
text: message.summary ?? message.content
76-
)
77-
}
78-
chatRoom.isReceivingMessage = await service.isReceivingMessage
79-
}
80-
}
81-
82-
chatRoom.onMessageSend = { [cancellable] message in
83-
_ = cancellable
84-
Task {
85-
do {
86-
_ = try await chatService.send(content: message)
87-
} catch {
88-
presentError(error)
89-
}
90-
}
91-
}
92-
chatRoom.onStop = {
93-
Task {
94-
await chatService.stopReceivingMessage()
95-
}
96-
}
97-
98-
chatRoom.onClear = {
99-
Task {
100-
await chatService.clearHistory()
101-
}
102-
}
103-
104-
chatRoom.onClose = {
105-
Task {
106-
await chatService.stopReceivingMessage()
107-
closeChatRoom(fileURL: fileURL)
108-
}
109-
}
110-
51+
func presentChatGPTConversation(fileURL: URL) {
11152
Task { @MainActor in
11253
let controller = GraphicalUserInterfaceController.shared.suggestionWidget
113-
controller.presentChatRoom(chatRoom, fileURL: fileURL)
54+
controller.presentChatRoom(fileURL: fileURL)
11455
}
11556
}
11657
}

0 commit comments

Comments
 (0)