From 06987c1989da3fef6067b87c497e61d3062bf80a Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 21 Oct 2026 15:44:15 -0700 Subject: [PATCH] Coalesce overlapping task-list reloads from streamed events --- mac/Sources/Byre/Store.swift | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/mac/Sources/Byre/Store.swift b/mac/Sources/Byre/Store.swift index 7fe0507..41e8248 100644 --- a/mac/Sources/Byre/Store.swift +++ b/mac/Sources/Byre/Store.swift @@ -87,6 +87,8 @@ final class Store { private var taskFeeds: [String: Feed] = [:] @ObservationIgnored private var historyLoads: Set = [] @ObservationIgnored private var requestSeqs: [String: Int] = [:] + @ObservationIgnored private var taskReloads: Set = [] + @ObservationIgnored private var taskReloadAgain: Set = [] @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":