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] = [:]
|
private var taskFeeds: [String: Feed] = [:]
|
||||||
@ObservationIgnored private var historyLoads: Set<ObjectIdentifier> = []
|
@ObservationIgnored private var historyLoads: Set<ObjectIdentifier> = []
|
||||||
@ObservationIgnored private var requestSeqs: [String: Int] = [:]
|
@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 terminalChanges = 0
|
||||||
@ObservationIgnored private var globalStream: EventStream?
|
@ObservationIgnored private var globalStream: EventStream?
|
||||||
@ObservationIgnored private var leadStream: 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 {
|
func loadSessions(_ taskId: String) async throws {
|
||||||
let latest = claimRequest("sessions:\(taskId)")
|
let latest = claimRequest("sessions:\(taskId)")
|
||||||
let list = try await api.client.listSessions(path: .init(taskId: taskId)).ok.body.json
|
let list = try await api.client.listSessions(path: .init(taskId: taskId)).ok.body.json
|
||||||
@@ -709,7 +734,7 @@ final class Store {
|
|||||||
notifyTask(self, ev)
|
notifyTask(self, ev)
|
||||||
if let projectId = ev.projectId {
|
if let projectId = ev.projectId {
|
||||||
spawn("load tasks") {
|
spawn("load tasks") {
|
||||||
try await self.loadTasks(projectId)
|
try await self.reloadTasks(projectId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "session.created", "session.state", "session.subagents", "session.model":
|
case "session.created", "session.state", "session.subagents", "session.model":
|
||||||
@@ -732,7 +757,7 @@ final class Store {
|
|||||||
}
|
}
|
||||||
if let projectId = ev.projectId {
|
if let projectId = ev.projectId {
|
||||||
spawn("load tasks") {
|
spawn("load tasks") {
|
||||||
try await self.loadTasks(projectId)
|
try await self.reloadTasks(projectId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "inbox.updated":
|
case "inbox.updated":
|
||||||
@@ -750,7 +775,7 @@ final class Store {
|
|||||||
notifyError(self, ev)
|
notifyError(self, ev)
|
||||||
if let projectId = ev.projectId {
|
if let projectId = ev.projectId {
|
||||||
spawn("load tasks") {
|
spawn("load tasks") {
|
||||||
try await self.loadTasks(projectId)
|
try await self.reloadTasks(projectId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "task.merge_facts":
|
case "task.merge_facts":
|
||||||
|
|||||||
Reference in New Issue
Block a user