Open merge dialog instantly from pushed merge facts

This commit is contained in:
Ian Gulliver
2026-10-21 11:48:21 -07:00
parent 4bb6f1fa11
commit 890fb6b691
15 changed files with 736 additions and 678 deletions
+8 -30
View File
@@ -36,11 +36,9 @@ final class ChatModel {
private(set) var scrollRequest: (seq: Int, id: Int?, anchor: UnitPoint)?
private(set) var fetching = false
private(set) var older: [ByreEvent]?
private(set) var hasUnmerged = false
@ObservationIgnored var stuck = true
@ObservationIgnored var prepended = false
@ObservationIgnored var released: Int?
@ObservationIgnored private var unmergedTimer: Task<Void, Never>?
@ObservationIgnored private var offs: [() -> Void] = []
@ObservationIgnored private var focusStart = true
@ObservationIgnored private var visibleSummaries: Set<Int64> = []
@@ -81,6 +79,13 @@ final class ChatModel {
return nil
}
var hasUnmerged: Bool {
guard let f = taskId.flatMap(store.findTask)?.mergeFacts else {
return false
}
return f.unmergedCommits > 0 || f.unmergedFiles > 0
}
private var feed: Feed? {
switch kind {
case .lead: store.leadFeed
@@ -161,9 +166,6 @@ final class ChatModel {
guard let feed else {
return
}
Task {
await loadUnmerged()
}
appended(feed.events)
offs.append(feed.appended.add { [weak self] events in
self?.appended(events)
@@ -194,39 +196,15 @@ final class ChatModel {
NotificationCenter.default.removeObserver(keyObserver)
}
keyObserver = nil
unmergedTimer?.cancel()
unmergedTimer = nil
builder.stop()
store.drafts?.flush()
}
private func appended(_ all: [ByreEvent]) {
let events = all.filter(shows)
if events.contains(where: { $0.kind == "agent.tool_result" || $0.kind == "turn.ended" }) {
unmergedTimer?.cancel()
unmergedTimer = Task { [weak self] in
try? await Task.sleep(for: .milliseconds(1500))
if !Task.isCancelled {
await self?.loadUnmerged()
}
}
}
_ = builder.append(events)
_ = builder.append(all.filter(shows))
jump()
}
private func loadUnmerged() async {
guard let taskId else {
return
}
do {
let u = try await store.api.client.getUnmerged(path: .init(taskId: taskId)).ok.body.json
hasUnmerged = u.commits > 0 || u.files > 0
} catch {
log.error("load unmerged changes: \(errorText(error), privacy: .public)")
}
}
func takeFocus() -> Bool {
let asked = taskId != nil && store.composerFocus == taskId
if asked {