diff --git a/mac/Sources/Byre/Store.swift b/mac/Sources/Byre/Store.swift index 742957b..bf96caa 100644 --- a/mac/Sources/Byre/Store.swift +++ b/mac/Sources/Byre/Store.swift @@ -98,6 +98,8 @@ final class Store { @ObservationIgnored private var requestSeqs: [String: Int] = [:] @ObservationIgnored private var taskReloads: Set = [] @ObservationIgnored private var listReloads: Set = [] + @ObservationIgnored private var sessionReloads: Set = [] + @ObservationIgnored private var sessionRefetches: Set = [] @ObservationIgnored private var taskRefetches: [String: Set] = [:] @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