@@ -325,6 +325,7 @@ extension Workspace {
325325 }
326326
327327 func notifyOpenFile( filespace: Filespace ) {
328+ lastTriggerDate = Environment . now ( )
328329 Task {
329330 try await copilotSuggestionService? . notifyOpenTextDocument (
330331 fileURL: filespace. fileURL,
@@ -334,6 +335,8 @@ extension Workspace {
334335 }
335336
336337 func notifyUpdateFile( filespace: Filespace , content: String ) {
338+ filespace. refreshUpdateTime ( )
339+ lastTriggerDate = Environment . now ( )
337340 Task {
338341 try await copilotSuggestionService? . notifyChangeTextDocument (
339342 fileURL: filespace. fileURL,
@@ -343,23 +346,32 @@ extension Workspace {
343346 }
344347
345348 func notifySaveFile( filespace: Filespace ) {
349+ filespace. refreshUpdateTime ( )
350+ lastTriggerDate = Environment . now ( )
346351 Task {
347352 try await copilotSuggestionService? . notifySaveTextDocument ( fileURL: filespace. fileURL)
348353 }
349354 }
350355}
351356
352357extension Workspace {
353- func cleanUp( ) {
354- for (fileURL, filespace ) in filespaces {
355- if filespace . isExpired {
358+ func cleanUp( availableTabs : Set < String > ) {
359+ for (fileURL, _ ) in filespaces {
360+ if isFilespaceExpired ( fileURL : fileURL , availableTabs : availableTabs ) {
356361 Task {
357362 try await copilotSuggestionService? . notifyCloseTextDocument ( fileURL: fileURL)
358363 }
359364 filespaces [ fileURL] = nil
360365 }
361366 }
362367 }
368+
369+ func isFilespaceExpired( fileURL: URL , availableTabs: Set < String > ) -> Bool {
370+ let filename = fileURL. lastPathComponent
371+ if availableTabs. contains ( filename) { return false }
372+ guard let filespace = filespaces [ fileURL] else { return true }
373+ return filespace. isExpired
374+ }
363375
364376 func cancelInFlightRealtimeSuggestionRequests( ) {
365377 for task in realtimeSuggestionRequests {
0 commit comments