Skip to content

Commit f03279f

Browse files
committed
Support rewrite with custom command
1 parent 1c5a9a8 commit f03279f

File tree

3 files changed

+86
-18
lines changed

3 files changed

+86
-18
lines changed

Core/Sources/ChatService/ChatService.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,5 +231,20 @@ public final class ChatService: ObservableObject {
231231
}
232232
return try await sendAndWait(content: templateProcessor.process(prompt))
233233
}
234+
235+
public func processMessage(
236+
systemPrompt: String?,
237+
extraSystemPrompt: String?,
238+
prompt: String
239+
) async throws -> String {
240+
let templateProcessor = CustomCommandTemplateProcessor()
241+
if let systemPrompt {
242+
mutateSystemPrompt(templateProcessor.process(systemPrompt))
243+
}
244+
if let extraSystemPrompt {
245+
mutateExtraSystemPrompt(templateProcessor.process(extraSystemPrompt))
246+
}
247+
return try await sendAndWait(content: templateProcessor.process(prompt))
248+
}
234249
}
235250

Core/Sources/Service/GUI/GraphicalUserInterfaceController.swift.swift

Lines changed: 70 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import AppKit
22
import ChatGPTChatTab
3+
import ChatService
34
import ChatTab
45
import ComposableArchitecture
56
import Environment
67
import Preferences
8+
import PromptToCodeService
79
import SuggestionModel
810
import SuggestionWidget
911
import XcodeInspector
@@ -116,11 +118,11 @@ public final class GraphicalUserInterfaceController {
116118
private init() {
117119
let suggestionDependency = SuggestionWidgetControllerDependency()
118120
let setupDependency: (inout DependencyValues) -> Void = { dependencies in
119-
dependencies.suggestionWidgetControllerDependency = suggestionDependency
120-
dependencies.suggestionWidgetUserDefaultsObservers = .init()
121-
dependencies.chatTabBuilderCollection = {
122-
ChatTabFactory.chatTabBuilderCollection
123-
}
121+
dependencies.suggestionWidgetControllerDependency = suggestionDependency
122+
dependencies.suggestionWidgetUserDefaultsObservers = .init()
123+
dependencies.chatTabBuilderCollection = {
124+
ChatTabFactory.chatTabBuilderCollection
125+
}
124126
}
125127
let store = StoreOf<GUI>(
126128
initialState: .init(),
@@ -182,20 +184,71 @@ enum ChatTabFactory {
182184

183185
let collection = [
184186
folderIfNeeded(ChatGPTChatTab.chatBuilders(), title: ChatGPTChatTab.name),
185-
folderIfNeeded(BrowserChatTab.chatBuilders(externalDependency: .init(getEditorContent: {
186-
guard let editor = XcodeInspector.shared.focusedEditor else {
187-
return .init(selectedText: "", language: "", fileContent: "")
188-
}
189-
let content = editor.content
190-
return .init(
191-
selectedText: content.selectedContent,
192-
language: languageIdentifierFromFileURL(XcodeInspector.shared.activeDocumentURL)
187+
folderIfNeeded(BrowserChatTab.chatBuilders(externalDependency: .init(
188+
getEditorContent: {
189+
guard let editor = XcodeInspector.shared.focusedEditor else {
190+
return .init(selectedText: "", language: "", fileContent: "")
191+
}
192+
let content = editor.content
193+
return .init(
194+
selectedText: content.selectedContent,
195+
language: languageIdentifierFromFileURL(
196+
XcodeInspector.shared
197+
.activeDocumentURL
198+
)
193199
.rawValue,
194-
fileContent: content.content
195-
)
196-
})), title: BrowserChatTab.name),
200+
fileContent: content.content
201+
)
202+
},
203+
handleCustomCommand: { command, prompt in
204+
switch command.feature {
205+
case let .chatWithSelection(extraSystemPrompt, _, useExtraSystemPrompt):
206+
let service = ChatService()
207+
return try await service.processMessage(
208+
systemPrompt: nil,
209+
extraSystemPrompt: (useExtraSystemPrompt ?? false) ? extraSystemPrompt :
210+
nil,
211+
prompt: prompt
212+
)
213+
case let .customChat(systemPrompt, _):
214+
let service = ChatService()
215+
return try await service.processMessage(
216+
systemPrompt: systemPrompt,
217+
extraSystemPrompt: nil,
218+
prompt: prompt
219+
)
220+
case let .singleRoundDialog(
221+
systemPrompt,
222+
overwriteSystemPrompt,
223+
_,
224+
_
225+
):
226+
let service = ChatService()
227+
return try await service.handleSingleRoundDialogCommand(
228+
systemPrompt: systemPrompt,
229+
overwriteSystemPrompt: overwriteSystemPrompt ?? false,
230+
prompt: prompt
231+
)
232+
case let .promptToCode(extraSystemPrompt, instruction, _, _):
233+
let service = PromptToCodeService(
234+
code: prompt,
235+
selectionRange: .outOfScope,
236+
language: .plaintext,
237+
identSize: 4,
238+
usesTabsForIndentation: true,
239+
projectRootURL: .init(fileURLWithPath: "/"),
240+
fileURL: .init(fileURLWithPath: "/"),
241+
allCode: prompt,
242+
extraSystemPrompt: extraSystemPrompt,
243+
generateDescriptionRequirement: false
244+
)
245+
try await service.modifyCode(prompt: instruction ?? "Modify content.")
246+
return service.code
247+
}
248+
}
249+
)), title: BrowserChatTab.name),
197250
].compactMap { $0 }
198-
251+
199252
return collection
200253
}
201254
}

Pro

Submodule Pro updated from dfbf605 to da49861

0 commit comments

Comments
 (0)