Coalesce session refreshes during event bursts
This commit is contained in:
@@ -98,6 +98,8 @@ final class Store {
|
||||
@ObservationIgnored private var requestSeqs: [String: Int] = [:]
|
||||
@ObservationIgnored private var taskReloads: Set<String> = []
|
||||
@ObservationIgnored private var listReloads: Set<String> = []
|
||||
@ObservationIgnored private var sessionReloads: Set<String> = []
|
||||
@ObservationIgnored private var sessionRefetches: Set<String> = []
|
||||
@ObservationIgnored private var taskRefetches: [String: Set<String>] = [:]
|
||||
@ObservationIgnored private var terminalChanges = 0
|
||||
@ObservationIgnored private var streamOpens = 0
|
||||
@@ -854,13 +856,9 @@ final class Store {
|
||||
reloadTask(ev)
|
||||
case "session.created", "session.state", "session.subagents", "session.model":
|
||||
if ev.owner != nil {
|
||||
spawn("load lead sessions") {
|
||||
try await self.loadLeadSessions()
|
||||
}
|
||||
reloadSessions(nil)
|
||||
} else if let taskId = ev.taskId {
|
||||
spawn("load sessions") {
|
||||
try await self.loadSessions(taskId)
|
||||
}
|
||||
reloadSessions(taskId)
|
||||
}
|
||||
case "inbox.created":
|
||||
if let taskId = ev.taskId {
|
||||
@@ -917,6 +915,34 @@ final class Store {
|
||||
events.send(ev)
|
||||
}
|
||||
|
||||
private func reloadSessions(_ taskId: String?) {
|
||||
let key = taskId ?? "lead"
|
||||
sessionRefetches.insert(key)
|
||||
guard sessionReloads.insert(key).inserted else {
|
||||
return
|
||||
}
|
||||
spawn("load sessions") {
|
||||
defer {
|
||||
self.sessionReloads.remove(key)
|
||||
}
|
||||
var failure: (any Error)?
|
||||
while self.sessionRefetches.remove(key) != nil {
|
||||
do {
|
||||
if let taskId {
|
||||
try await self.loadSessions(taskId)
|
||||
} else {
|
||||
try await self.loadLeadSessions()
|
||||
}
|
||||
} catch {
|
||||
failure = error
|
||||
}
|
||||
}
|
||||
if let failure {
|
||||
throw failure
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func reloadTask(_ ev: ByreEvent) {
|
||||
guard let projectId = ev.projectId, let taskId = ev.taskId else {
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user