@@ -15,14 +15,10 @@ import ProChatTabs
1515enum ChatTabFactory {
1616 static func chatTabBuilderCollection( ) -> [ ChatTabBuilderCollection ] {
1717 #if canImport(ProChatTabs)
18+ _ = lazyLoadDependency
1819 let collection = [
1920 folderIfNeeded ( ChatGPTChatTab . chatBuilders ( ) , title: ChatGPTChatTab . name) ,
20- folderIfNeeded (
21- BrowserChatTab . chatBuilders (
22- externalDependency: externalDependenciesForBrowserChatTab ( )
23- ) ,
24- title: BrowserChatTab . name
25- ) ,
21+ folderIfNeeded ( BrowserChatTab . chatBuilders ( ) , title: BrowserChatTab . name) ,
2622 folderIfNeeded ( TerminalChatTab . chatBuilders ( ) , title: TerminalChatTab . name) ,
2723 ]
2824 #else
@@ -47,83 +43,68 @@ enum ChatTabFactory {
4743
4844 static func chatTabsFromExtensions( ) -> [ ChatTabBuilderCollection ] {
4945 let extensions = BuiltinExtensionManager . shared. extensions
50- let chatBuilders = extensions. flatMap { $0 . chatBuilders }
51- return chatBuilders . compactMap { folderIfNeeded ( $0. value , title: $0. key ) }
46+ let chatTabTypes = extensions. flatMap ( \ . chatTabTypes )
47+ return chatTabTypes . compactMap { folderIfNeeded ( $0. chatBuilders ( ) , title: $0. name ) }
5248 }
53-
54- #if canImport(ProChatTabs)
55- static func externalDependenciesForBrowserChatTab( ) -> BrowserChatTab . ExternalDependency {
56- . init(
57- getEditorContent: {
58- guard let editor = XcodeInspector . shared. focusedEditor else {
59- return . init( selectedText: " " , language: " " , fileContent: " " )
60- }
61- let content = editor. getContent ( )
62- return . init(
63- selectedText: content. selectedContent,
64- language: (
65- XcodeInspector . shared. activeDocumentURL
66- . map ( languageIdentifierFromFileURL) ?? . plaintext
67- ) . rawValue,
68- fileContent: content. content
69- )
70- } ,
71- handleCustomCommand: { command, prompt in
72- switch command. feature {
73- case let . chatWithSelection( extraSystemPrompt, _, useExtraSystemPrompt) :
74- let service = ChatService ( )
75- return try await service. processMessage (
76- systemPrompt: nil ,
77- extraSystemPrompt: ( useExtraSystemPrompt ?? false ) ? extraSystemPrompt :
78- nil ,
79- prompt: prompt
80- )
81- case let . customChat( systemPrompt, _) :
82- let service = ChatService ( )
83- return try await service. processMessage (
84- systemPrompt: systemPrompt,
85- extraSystemPrompt: nil ,
86- prompt: prompt
87- )
88- case let . singleRoundDialog(
89- systemPrompt,
90- overwriteSystemPrompt,
91- _,
92- _
93- ) :
94- let service = ChatService ( )
95- return try await service. handleSingleRoundDialogCommand (
96- systemPrompt: systemPrompt,
97- overwriteSystemPrompt: overwriteSystemPrompt ?? false ,
98- prompt: prompt
99- )
100- case let . promptToCode( extraSystemPrompt, instruction, _, _) :
101- let service = OpenAIPromptToCodeService ( )
102-
103- let result = try await service. modifyCode (
104- code: prompt,
105- requirement: instruction ?? " Modify content. " ,
106- source: . init(
107- language: . plaintext,
108- documentURL: . init( fileURLWithPath: " / " ) ,
109- projectRootURL: . init( fileURLWithPath: " / " ) ,
110- content: prompt,
111- lines: prompt. breakLines ( ) ,
112- range: . outOfScope
113- ) ,
114- isDetached: true ,
115- extraSystemPrompt: extraSystemPrompt,
116- generateDescriptionRequirement: false
117- )
118- var code = " "
119- for try await (newCode, _) in result {
120- code = newCode
121- }
122- return code
123- }
124- }
125- )
126- }
127- #endif
12849}
12950
51+ #if canImport(ProChatTabs)
52+ let lazyLoadDependency : ( ) = {
53+ BrowserChatTab . externalDependency = . init(
54+ handleCustomCommand: { command, prompt in
55+ switch command. feature {
56+ case let . chatWithSelection( extraSystemPrompt, _, useExtraSystemPrompt) :
57+ let service = ChatService ( )
58+ return try await service. processMessage (
59+ systemPrompt: nil ,
60+ extraSystemPrompt: ( useExtraSystemPrompt ?? false ) ? extraSystemPrompt :
61+ nil ,
62+ prompt: prompt
63+ )
64+ case let . customChat( systemPrompt, _) :
65+ let service = ChatService ( )
66+ return try await service. processMessage (
67+ systemPrompt: systemPrompt,
68+ extraSystemPrompt: nil ,
69+ prompt: prompt
70+ )
71+ case let . singleRoundDialog(
72+ systemPrompt,
73+ overwriteSystemPrompt,
74+ _,
75+ _
76+ ) :
77+ let service = ChatService ( )
78+ return try await service. handleSingleRoundDialogCommand (
79+ systemPrompt: systemPrompt,
80+ overwriteSystemPrompt: overwriteSystemPrompt ?? false ,
81+ prompt: prompt
82+ )
83+ case let . promptToCode( extraSystemPrompt, instruction, _, _) :
84+ let service = OpenAIPromptToCodeService ( )
85+
86+ let result = try await service. modifyCode (
87+ code: prompt,
88+ requirement: instruction ?? " Modify content. " ,
89+ source: . init(
90+ language: . plaintext,
91+ documentURL: . init( fileURLWithPath: " / " ) ,
92+ projectRootURL: . init( fileURLWithPath: " / " ) ,
93+ content: prompt,
94+ lines: prompt. breakLines ( ) ,
95+ range: . outOfScope
96+ ) ,
97+ isDetached: true ,
98+ extraSystemPrompt: extraSystemPrompt,
99+ generateDescriptionRequirement: false
100+ )
101+ var code = " "
102+ for try await (newCode, _) in result {
103+ code = newCode
104+ }
105+ return code
106+ }
107+ }
108+ )
109+ } ( )
110+ #endif
0 commit comments