Open merge dialog instantly from pushed merge facts
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user