@@ -9,32 +9,47 @@ public final class ScheduledCleaner {
99 // occasionally cleanup workspaces.
1010 Task { @ServiceActor in
1111 while !Task. isCancelled {
12- try await Task . sleep ( nanoseconds: 4 * 60 * 60 * 1_000_000_000 )
13- let availableTabs = findAvailableOpenedTabs ( )
14- for (url, workspace) in workspaces {
15- if workspace. isExpired {
16- Logger . service. info ( " Remove idle workspace " )
17- for url in workspace. filespaces. keys {
18- WidgetDataSource . shared. cleanup ( for: url)
19- }
20- workspace. cleanUp ( availableTabs: availableTabs)
21- workspaces [ url] = nil
22- } else {
23- // cleanup chats for unused files
24- let filespaces = workspace. filespaces
25- for (url, _) in filespaces {
26- if workspace. isFilespaceExpired (
27- fileURL: url,
28- availableTabs: availableTabs
29- ) {
30- Logger . service. info ( " Remove idle filespace " )
31- WidgetDataSource . shared. cleanup ( for: url)
32- }
33- }
34- // cleanup workspace
35- workspace. cleanUp ( availableTabs: availableTabs)
12+ try await Task . sleep ( nanoseconds: 10 * 60 * 1_000_000_000 )
13+ cleanUp ( )
14+ }
15+ }
16+
17+ // cleanup when Xcode becomes inactive
18+ Task { @ServiceActor in
19+ for await app in ActiveApplicationMonitor . createStream ( ) {
20+ try Task . checkCancellation ( )
21+ if let app, !app. isXcode {
22+ cleanUp ( )
23+ }
24+ }
25+ }
26+ }
27+
28+ @ServiceActor
29+ func cleanUp( ) {
30+ let availableTabs = findAvailableOpenedTabs ( )
31+ for (url, workspace) in workspaces {
32+ if workspace. isExpired {
33+ Logger . service. info ( " Remove idle workspace " )
34+ for url in workspace. filespaces. keys {
35+ WidgetDataSource . shared. cleanup ( for: url)
36+ }
37+ workspace. cleanUp ( availableTabs: availableTabs)
38+ workspaces [ url] = nil
39+ } else {
40+ // cleanup chats for unused files
41+ let filespaces = workspace. filespaces
42+ for (url, _) in filespaces {
43+ if workspace. isFilespaceExpired (
44+ fileURL: url,
45+ availableTabs: availableTabs
46+ ) {
47+ Logger . service. info ( " Remove idle filespace " )
48+ WidgetDataSource . shared. cleanup ( for: url)
3649 }
3750 }
51+ // cleanup workspace
52+ workspace. cleanUp ( availableTabs: availableTabs)
3853 }
3954 }
4055 }
0 commit comments