-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathAgentModeDropdownView.swift
More file actions
87 lines (78 loc) · 2.83 KB
/
AgentModeDropdownView.swift
File metadata and controls
87 lines (78 loc) · 2.83 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
import Client
import ConversationServiceProvider
import HostAppActivator
import Logger
import Persist
import SwiftUI
struct AgentModeDropdown: View {
@Binding var modes: [ConversationMode]
@Binding var selectedMode: ConversationMode
public init(modes: Binding<[ConversationMode]>, selectedMode: Binding<ConversationMode>) {
_modes = modes
_selectedMode = selectedMode
}
var builtInModes: [ConversationMode] {
modes.filter { $0.isBuiltIn }
}
var customModes: [ConversationMode] {
modes.filter { !$0.isBuiltIn }
}
var body: some View {
Picker(selection: Binding(
get: { selectedMode.id },
set: { newId in
if let mode = modes.first(where: { $0.id == newId }) {
selectedMode = mode
}
}
)) {
ForEach(builtInModes, id: \.id) { mode in
Text(mode.name).tag(mode.id)
}
if !customModes.isEmpty {
Divider()
ForEach(customModes, id: \.id) { mode in
Text(mode.name).tag(mode.id)
}
}
} label: {
Text("Applied for").fontWeight(.bold)
}
.pickerStyle(.menu)
.frame(maxWidth: 300, alignment: .leading)
.padding(.leading, -4)
.onAppear {
loadModes()
}
.onReceive(DistributedNotificationCenter.default().publisher(for: .selectedAgentSubModeDidChange)) { notification in
if let userInfo = notification.userInfo as? [String: String],
let newModeId = userInfo["agentSubMode"],
newModeId != selectedMode.id,
let mode = modes.first(where: { $0.id == newModeId }) {
Logger.client.info("AgentModeDropdown: Mode changed to: \(newModeId)")
selectedMode = mode
}
}
}
// MARK: - Helper Methods
private func loadModes() {
Task {
do {
let service = try getService()
let workspaceFolders = await getWorkspaceFolders()
if let fetchedModes = try await service.getModes(workspaceFolders: workspaceFolders) {
Logger.client.info("AgentModeDropdown: Fetched \(fetchedModes.count) modes")
await MainActor.run {
modes = fetchedModes.filter { $0.kind == .Agent }
if !modes.contains(where: { $0.id == selectedMode.id }),
let firstMode = modes.first {
selectedMode = firstMode
}
}
}
} catch {
Logger.client.error("AgentModeDropdown: Failed to load modes: \(error.localizedDescription)")
}
}
}
}