Merge pull request #350 from AkhilKonduru1/screen-assistant-reset-context

Enhanced Screen Assistant reset context handling
This commit is contained in:
Hariharan Mudaliar 2026-03-19 21:42:49 +05:30 • committed by GitHub
commit 31c896ec13
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 35 additions and 1 deletions

View file

@ -219,6 +219,7 @@ struct ChatMessagesView: View {
.background(Color.gray.opacity(0.12)) .background(Color.gray.opacity(0.12))
.cornerRadius(8) .cornerRadius(8)
} }
.disabled(screenAssistantManager.isLoading)
.buttonStyle(PlainButtonStyle()) .buttonStyle(PlainButtonStyle())
.help("Clear conversation and attachments") .help("Clear conversation and attachments")

View file

@ -120,6 +120,7 @@ class ScreenAssistantManager: NSObject, ObservableObject {
private var audioRecorder: AVAudioRecorder? private var audioRecorder: AVAudioRecorder?
private var recordingTimer: Timer? private var recordingTimer: Timer?
private var activeRequest: URLSessionTask?
// Panel management // Panel management
private var chatMessagesPanel: ChatMessagesPanel? private var chatMessagesPanel: ChatMessagesPanel?
@ -664,10 +665,18 @@ class ScreenAssistantManager: NSObject, ObservableObject {
let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in
DispatchQueue.main.async { DispatchQueue.main.async {
guard let self = self else { return } guard let self = self else { return }
// Ensure this callback belongs to the current in-flight request
guard self.activeRequest === task else { return }
self.isLoading = false
self.activeRequest = nil
self.handleResponse(data: data, response: response, error: error, provider: provider) self.handleResponse(data: data, response: response, error: error, provider: provider)
} }
} }
activeRequest = task
task.resume() task.resume()
} }
@ -690,10 +699,18 @@ class ScreenAssistantManager: NSObject, ObservableObject {
let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in
DispatchQueue.main.async { DispatchQueue.main.async {
guard let self = self else { return } guard let self = self else { return }
// Ensure this callback belongs to the current in-flight request
guard self.activeRequest === task else { return }
self.isLoading = false
self.activeRequest = nil
self.handleResponse(data: data, response: response, error: error, provider: .openai) self.handleResponse(data: data, response: response, error: error, provider: .openai)
} }
} }
activeRequest = task
task.resume() task.resume()
} }
@ -717,17 +734,29 @@ class ScreenAssistantManager: NSObject, ObservableObject {
let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in
DispatchQueue.main.async { DispatchQueue.main.async {
guard let self = self else { return } guard let self = self else { return }
// Ensure this callback belongs to the current in-flight request
guard self.activeRequest === task else { return }
self.isLoading = false
self.activeRequest = nil
self.handleResponse(data: data, response: response, error: error, provider: .claude) self.handleResponse(data: data, response: response, error: error, provider: .claude)
} }
} }
activeRequest = task
task.resume() task.resume()
} }
// MARK: - Response Handlers // MARK: - Response Handlers
private func handleResponse(data: Data?, response: URLResponse?, error: Error?, provider: AIModelProvider) { private func handleResponse(data: Data?, response: URLResponse?, error: Error?, provider: AIModelProvider) {
isLoading = false // Check if the request was cancelled (e.g., by resetConversationContext)
if let error = error as? NSError, error.code == NSURLErrorCancelled {
print("ℹ️ ScreenAssistant: Request was cancelled")
return
}
if let error = error { if let error = error {
print("❌ ScreenAssistant: Network error - \(error)") print("❌ ScreenAssistant: Network error - \(error)")
@ -1107,6 +1136,10 @@ class ScreenAssistantManager: NSObject, ObservableObject {
} }
func resetConversationContext() { func resetConversationContext() {
// Cancel any in-flight request
activeRequest?.cancel()
activeRequest = nil
isLoading = false isLoading = false
chatMessages.removeAll() chatMessages.removeAll()
clearAllFiles() clearAllFiles()