-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathBuiltinExtensionConversationServiceProvider.swift
More file actions
100 lines (85 loc) · 3.62 KB
/
BuiltinExtensionConversationServiceProvider.swift
File metadata and controls
100 lines (85 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import ConversationServiceProvider
import CopilotForXcodeKit
import Foundation
import Logger
import XcodeInspector
public final class BuiltinExtensionConversationServiceProvider<
T: BuiltinExtension
>: ConversationServiceProvider {
private let extensionManager: BuiltinExtensionManager
public init(
extension: T.Type,
extensionManager: BuiltinExtensionManager = .shared
) {
self.extensionManager = extensionManager
}
var conversationService: ConversationServiceType? {
extensionManager.extensions.first { $0 is T }?.conversationService
}
private func activeWorkspace() async -> WorkspaceInfo? {
guard let workspaceURL = await XcodeInspector.shared.safe.realtimeActiveWorkspaceURL,
let projectURL = await XcodeInspector.shared.safe.realtimeActiveProjectURL
else { return nil }
return WorkspaceInfo(workspaceURL: workspaceURL, projectURL: projectURL)
}
struct BuiltinExtensionChatServiceNotFoundError: Error, LocalizedError {
var errorDescription: String? {
"Builtin chat service not found."
}
}
public func createConversation(_ request: ConversationRequest) async throws {
guard let conversationService else {
Logger.service.error("Builtin chat service not found.")
return
}
guard let workspaceInfo = await activeWorkspace() else {
Logger.service.error("Could not get active workspace info")
return
}
try await conversationService.createConversation(request, workspace: workspaceInfo)
}
public func createTurn(with conversationId: String, request: ConversationRequest) async throws {
guard let conversationService else {
Logger.service.error("Builtin chat service not found.")
return
}
guard let workspaceInfo = await activeWorkspace() else {
Logger.service.error("Could not get active workspace info")
return
}
try await conversationService.createTurn(with: conversationId, request: request, workspace: workspaceInfo)
}
public func stopReceivingMessage(_ workDoneToken: String) async throws {
guard let conversationService else {
Logger.service.error("Builtin chat service not found.")
return
}
guard let workspaceInfo = await activeWorkspace() else {
Logger.service.error("Could not get active workspace info")
return
}
try await conversationService.cancelProgress(workDoneToken, workspace: workspaceInfo)
}
public func rateConversation(turnId: String, rating: ConversationRating) async throws {
guard let conversationService else {
Logger.service.error("Builtin chat service not found.")
return
}
guard let workspaceInfo = await activeWorkspace() else {
Logger.service.error("Could not get active workspace info")
return
}
try? await conversationService.rateConversation(turnId: turnId, rating: rating, workspace: workspaceInfo)
}
public func copyCode(_ request: CopyCodeRequest) async throws {
guard let conversationService else {
Logger.service.error("Builtin chat service not found.")
return
}
guard let workspaceInfo = await activeWorkspace() else {
Logger.service.error("Could not get active workspace info")
return
}
try? await conversationService.copyCode(request: request, workspace: workspaceInfo)
}
}