Coalesce session refreshes during event bursts

This commit is contained in:
Ian Gulliver
2026-10-22 16:55:30 -07:00
parent efa1513568
commit f8fde62aab
+32 -6
View File
@@ -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