Skip to content

Commit 6f0c727

Browse files
committed
Support creating different types of chats
1 parent f8f7e96 commit 6f0c727

File tree

22 files changed

+405
-121
lines changed

22 files changed

+405
-121
lines changed

Core/Package.swift

Lines changed: 25 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,11 @@ let package = Package(
1616
"LaunchAgentManager",
1717
"UpdateChecker",
1818
"UserDefaultsObserver",
19-
"XcodeInspector",
2019
]
2120
),
2221
.library(
2322
name: "Client",
2423
targets: [
25-
"SuggestionModel",
2624
"Client",
2725
"XPCShared",
2826
]
@@ -31,7 +29,6 @@ let package = Package(
3129
name: "HostApp",
3230
targets: [
3331
"HostApp",
34-
"SuggestionModel",
3532
"GitHubCopilotService",
3633
"Client",
3734
"XPCShared",
@@ -63,39 +60,39 @@ let package = Package(
6360
.target(
6461
name: "Client",
6562
dependencies: [
66-
"SuggestionModel",
6763
"XPCShared",
6864
"GitHubCopilotService",
65+
.product(name: "SuggestionModel", package: "Tool"),
6966
.product(name: "Logger", package: "Tool"),
7067
.product(name: "Preferences", package: "Tool"),
7168
]
7269
),
7370
.target(
7471
name: "Service",
7572
dependencies: [
76-
"SuggestionModel",
7773
"SuggestionService",
7874
"GitHubCopilotService",
7975
"XPCShared",
8076
"CGEventObserver",
8177
"DisplayLink",
82-
"ActiveApplicationMonitor",
83-
"AXNotificationStream",
84-
"Environment",
8578
"SuggestionWidget",
86-
"AXExtension",
8779
"ChatService",
8880
"PromptToCodeService",
8981
"ServiceUpdateMigration",
9082
"UserDefaultsObserver",
9183
"ChatGPTChatTab",
84+
.product(name: "AppMonitoring", package: "Tool"),
85+
.product(name: "Environment", package: "Tool"),
86+
.product(name: "SuggestionModel", package: "Tool"),
9287
.product(name: "ChatTab", package: "Tool"),
9388
.product(name: "Logger", package: "Tool"),
9489
.product(name: "OpenAIService", package: "Tool"),
9590
.product(name: "Preferences", package: "Tool"),
9691
.product(name: "AsyncAlgorithms", package: "swift-async-algorithms"),
9792
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
98-
]
93+
].pro([
94+
"ProChatTabs",
95+
])
9996
),
10097
.testTarget(
10198
name: "ServiceTests",
@@ -105,16 +102,8 @@ let package = Package(
105102
"GitHubCopilotService",
106103
"SuggestionInjector",
107104
"XPCShared",
108-
"Environment",
109-
"SuggestionModel",
110-
.product(name: "Preferences", package: "Tool"),
111-
]
112-
),
113-
.target(
114-
name: "Environment",
115-
dependencies: [
116-
"ActiveApplicationMonitor",
117-
"AXExtension",
105+
.product(name: "SuggestionModel", package: "Tool"),
106+
.product(name: "Environment", package: "Tool"),
118107
.product(name: "Preferences", package: "Tool"),
119108
]
120109
),
@@ -127,8 +116,8 @@ let package = Package(
127116
"Client",
128117
"GitHubCopilotService",
129118
"CodeiumService",
130-
"SuggestionModel",
131119
"LaunchAgentManager",
120+
.product(name: "SuggestionModel", package: "Tool"),
132121
.product(name: "MarkdownUI", package: "swift-markdown-ui"),
133122
.product(name: "OpenAIService", package: "Tool"),
134123
.product(name: "Preferences", package: "Tool"),
@@ -140,22 +129,14 @@ let package = Package(
140129

141130
.target(
142131
name: "XPCShared",
143-
dependencies: ["SuggestionModel"]
132+
dependencies: [.product(name: "SuggestionModel", package: "Tool"),]
144133
),
145134

146135
// MARK: - Suggestion Service
147136

148-
.target(
149-
name: "SuggestionModel",
150-
dependencies: ["LanguageClient"]
151-
),
152-
.testTarget(
153-
name: "SuggestionModelTests",
154-
dependencies: ["SuggestionModel"]
155-
),
156137
.target(
157138
name: "SuggestionInjector",
158-
dependencies: ["SuggestionModel"]
139+
dependencies: [.product(name: "SuggestionModel", package: "Tool"),]
159140
),
160141
.testTarget(
161142
name: "SuggestionInjectorTests",
@@ -172,9 +153,9 @@ let package = Package(
172153
.target(
173154
name: "PromptToCodeService",
174155
dependencies: [
175-
"Environment",
176156
"GitHubCopilotService",
177-
"SuggestionModel",
157+
.product(name: "SuggestionModel", package: "Tool"),
158+
.product(name: "Environment", package: "Tool"),
178159
.product(name: "OpenAIService", package: "Tool"),
179160
]
180161
),
@@ -187,8 +168,6 @@ let package = Package(
187168
dependencies: [
188169
"ChatPlugin",
189170
"ChatContextCollector",
190-
"Environment",
191-
"XcodeInspector",
192171

193172
// plugins
194173
"MathChatPlugin",
@@ -198,6 +177,8 @@ let package = Package(
198177
// context collectors
199178
"WebChatContextCollector",
200179

180+
.product(name: "AppMonitoring", package: "Tool"),
181+
.product(name: "Environment", package: "Tool"),
201182
.product(name: "Parsing", package: "swift-parsing"),
202183
.product(name: "OpenAIService", package: "Tool"),
203184
.product(name: "Preferences", package: "Tool"),
@@ -207,17 +188,17 @@ let package = Package(
207188
.target(
208189
name: "ChatPlugin",
209190
dependencies: [
210-
"Environment",
191+
.product(name: "Environment", package: "Tool"),
211192
.product(name: "OpenAIService", package: "Tool"),
212193
.product(name: "Terminal", package: "Tool"),
213194
]
214195
),
215196
.target(
216197
name: "ChatContextCollector",
217198
dependencies: [
218-
"Environment",
219-
"SuggestionModel",
220-
"XcodeInspector",
199+
.product(name: "SuggestionModel", package: "Tool"),
200+
.product(name: "AppMonitoring", package: "Tool"),
201+
.product(name: "Environment", package: "Tool"),
221202
.product(name: "OpenAIService", package: "Tool"),
222203
.product(name: "Preferences", package: "Tool"),
223204
]
@@ -251,12 +232,10 @@ let package = Package(
251232
name: "SuggestionWidget",
252233
dependencies: [
253234
"ChatGPTChatTab",
254-
"ActiveApplicationMonitor",
255-
"AXNotificationStream",
256-
"Environment",
257235
"UserDefaultsObserver",
258-
"XcodeInspector",
259236
"SharedUIComponents",
237+
.product(name: "AppMonitoring", package: "Tool"),
238+
.product(name: "Environment", package: "Tool"),
260239
.product(name: "ChatTab", package: "Tool"),
261240
.product(name: "Logger", package: "Tool"),
262241
.product(name: "AsyncAlgorithms", package: "swift-async-algorithms"),
@@ -277,21 +256,13 @@ let package = Package(
277256
.target(name: "FileChangeChecker"),
278257
.target(name: "LaunchAgentManager"),
279258
.target(name: "DisplayLink"),
280-
.target(name: "ActiveApplicationMonitor"),
281-
.target(
282-
name: "AXNotificationStream",
283-
dependencies: [
284-
.product(name: "Logger", package: "Tool"),
285-
]
286-
),
287259
.target(
288260
name: "UpdateChecker",
289261
dependencies: [
290262
"Sparkle",
291263
.product(name: "Logger", package: "Tool"),
292264
]
293265
),
294-
.target(name: "AXExtension"),
295266
.target(
296267
name: "ServiceUpdateMigration",
297268
dependencies: [
@@ -300,26 +271,15 @@ let package = Package(
300271
]
301272
),
302273
.target(name: "UserDefaultsObserver"),
303-
.target(
304-
name: "XcodeInspector",
305-
dependencies: [
306-
"AXExtension",
307-
"SuggestionModel",
308-
"Environment",
309-
"AXNotificationStream",
310-
.product(name: "Logger", package: "Tool"),
311-
.product(name: "AsyncAlgorithms", package: "swift-async-algorithms"),
312-
]
313-
),
314274

315275
// MARK: - GitHub Copilot
316276

317277
.target(
318278
name: "GitHubCopilotService",
319279
dependencies: [
320280
"LanguageClient",
321-
"SuggestionModel",
322281
"XPCShared",
282+
.product(name: "SuggestionModel", package: "Tool"),
323283
.product(name: "Logger", package: "Tool"),
324284
.product(name: "Preferences", package: "Tool"),
325285
.product(name: "Terminal", package: "Tool"),
@@ -337,9 +297,9 @@ let package = Package(
337297
name: "CodeiumService",
338298
dependencies: [
339299
"LanguageClient",
340-
"SuggestionModel",
341300
"KeychainAccess",
342-
"XcodeInspector",
301+
.product(name: "SuggestionModel", package: "Tool"),
302+
.product(name: "AppMonitoring", package: "Tool"),
343303
.product(name: "Preferences", package: "Tool"),
344304
.product(name: "Terminal", package: "Tool"),
345305
]

Core/Sources/ChatGPTChatTab/ChatGPTChatTab.swift

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,52 @@ import ChatService
22
import ChatTab
33
import Combine
44
import Foundation
5+
import Preferences
56
import SwiftUI
67

78
/// A chat tab that provides a context aware chat bot, powered by ChatGPT.
89
public class ChatGPTChatTab: ChatTab {
10+
public static var name: String { "Chat" }
11+
912
public let service: ChatService
1013
public let provider: ChatProvider
1114
private var cancellable = Set<AnyCancellable>()
1215

16+
struct Builder: ChatTabBuilder {
17+
var title: String
18+
var customCommand: CustomCommand?
19+
20+
func build() -> any ChatTab {
21+
let tab = ChatGPTChatTab()
22+
Task {
23+
if let customCommand {
24+
try await tab.service.handleCustomCommand(customCommand)
25+
}
26+
}
27+
return tab
28+
}
29+
}
30+
1331
public func buildView() -> any View {
1432
ChatPanel(chat: provider)
1533
}
16-
34+
1735
public func buildMenu() -> any View {
1836
ChatContextMenu(chat: provider)
1937
}
2038

39+
public static func chatBuilders(externalDependency: Void) -> [ChatTabBuilder] {
40+
let customCommands = UserDefaults.shared.value(for: \.customCommands).compactMap {
41+
command in
42+
if case .customChat = command.feature {
43+
return Builder(title: command.name, customCommand: command)
44+
}
45+
return nil
46+
}
47+
48+
return [Builder(title: "ChatGPT", customCommand: nil)] + customCommands
49+
}
50+
2151
public init(service: ChatService = .init()) {
2252
self.service = service
2353
provider = .init(service: service)

0 commit comments

Comments
 (0)