Coalesce overlapping task-list reloads from streamed events

This commit is contained in:
Ian Gulliver
2026-10-21 15:44:15 -07:00
parent 056c3d202a
commit 06987c1989
+28 -3
View File
@@ -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":