Coalesce overlapping task-list reloads from streamed events
This commit is contained in:
@@ -87,6 +87,8 @@ final class Store {
|
||||
private var taskFeeds: [String: Feed] = [:]
|
||||
@ObservationIgnored private var historyLoads: Set<ObjectIdentifier> = []
|
||||
@ObservationIgnored private var requestSeqs: [String: Int] = [:]
|
||||
@ObservationIgnored private var taskReloads: Set<String> = []
|
||||
@ObservationIgnored private var taskReloadAgain: Set<String> = []
|
||||
@ObservationIgnored private var terminalChanges = 0
|
||||
@ObservationIgnored private var globalStream: EventStream?
|
||||
@ObservationIgnored private var leadStream: EventStream?
|
||||
@@ -367,6 +369,29 @@ final class Store {
|
||||
}
|
||||
}
|
||||
|
||||
private func reloadTasks(_ projectId: String) async throws {
|
||||
guard taskReloads.insert(projectId).inserted else {
|
||||
taskReloadAgain.insert(projectId)
|
||||
return
|
||||
}
|
||||
defer {
|
||||
taskReloads.remove(projectId)
|
||||
taskReloadAgain.remove(projectId)
|
||||
}
|
||||
var failure: (any Error)?
|
||||
repeat {
|
||||
taskReloadAgain.remove(projectId)
|
||||
do {
|
||||
try await loadTasks(projectId)
|
||||
} catch {
|
||||
failure = error
|
||||
}
|
||||
} while taskReloadAgain.contains(projectId)
|
||||
if let failure {
|
||||
throw failure
|
||||
}
|
||||
}
|
||||
|
||||
func loadSessions(_ taskId: String) async throws {
|
||||
let latest = claimRequest("sessions:\(taskId)")
|
||||
let list = try await api.client.listSessions(path: .init(taskId: taskId)).ok.body.json
|
||||
@@ -709,7 +734,7 @@ final class Store {
|
||||
notifyTask(self, ev)
|
||||
if let projectId = ev.projectId {
|
||||
spawn("load tasks") {
|
||||
try await self.loadTasks(projectId)
|
||||
try await self.reloadTasks(projectId)
|
||||
}
|
||||
}
|
||||
case "session.created", "session.state", "session.subagents", "session.model":
|
||||
@@ -732,7 +757,7 @@ final class Store {
|
||||
}
|
||||
if let projectId = ev.projectId {
|
||||
spawn("load tasks") {
|
||||
try await self.loadTasks(projectId)
|
||||
try await self.reloadTasks(projectId)
|
||||
}
|
||||
}
|
||||
case "inbox.updated":
|
||||
@@ -750,7 +775,7 @@ final class Store {
|
||||
notifyError(self, ev)
|
||||
if let projectId = ev.projectId {
|
||||
spawn("load tasks") {
|
||||
try await self.loadTasks(projectId)
|
||||
try await self.reloadTasks(projectId)
|
||||
}
|
||||
}
|
||||
case "task.merge_facts":
|
||||
|
||||
Reference in New Issue
Block a user