Show the merge prompt before fetching so Merge has no blank pause

This commit is contained in:
Ian Gulliver
2026-10-17 07:34:43 -07:00
parent e28c313854
commit 4612aece55
3 changed files with 83 additions and 12 deletions
+74 -9
View File
@@ -117,12 +117,7 @@ func (m *Manager) projectMerge(projectID string) *projectMerge {
}
func (m *Manager) startMerge(ctx context.Context, pm *projectMerge, task api.Task, project api.Project, user api.User) error {
err := git.FetchFastForward(ctx, project.RepoPath, project.DefaultBranch)
if err != nil {
return err
}
err = m.store.SetMergingBy(ctx, task.Id, user.Login)
err := m.store.SetMergingBy(ctx, task.Id, user.Login)
if errors.Is(err, store.ErrNotFound) {
return fmt.Errorf("%w: task %s is being discarded", ErrConflict, task.Id)
}
@@ -131,13 +126,83 @@ func (m *Manager) startMerge(ctx context.Context, pm *projectMerge, task api.Tas
}
pm.holder = task.Id
prompt := mergeInPrompt(project.DefaultBranch) + fmt.Sprintf(" When this turn ends, byre squashes this branch onto %s and pushes it; if you stop, call stop_merge first so it doesn't. ", project.DefaultBranch) + summaryRequest
_, err = m.sendMergeIn(ctx, task, user, prompt)
sess, err := m.mergeSession(ctx, task, user)
if err != nil {
m.takeMerge(task.Id)
pm.holder = ""
return err
}
return err
prompt := mergeInPrompt(project.DefaultBranch) + fmt.Sprintf(" When this turn ends, byre squashes this branch onto %s and pushes it; if you stop, call stop_merge first so it doesn't. ", project.DefaultBranch) + summaryRequest
go m.launchMerge(sess, task, project, prompt)
return nil
}
func (m *Manager) mergeSession(ctx context.Context, task api.Task, user api.User) (api.AgentSession, error) {
sessions, err := m.store.ListSessions(ctx, task.Id)
if err != nil {
return api.AgentSession{}, err
}
sess := api.AgentSession{}
for _, s := range sessions {
if s.State != api.AgentSessionStateCompleted {
sess = s
}
}
if sess.Id == "" {
sess, err = m.newSession(ctx, task, user, "")
if err != nil {
return api.AgentSession{}, err
}
}
err = transition(ctx, m.store, sess.Id, api.AgentSessionStateIdle, api.AgentSessionStateRunning, "byre")
return sess, err
}
func (m *Manager) launchMerge(sess api.AgentSession, task api.Task, project api.Project, prompt string) {
ctx := context.Background()
err := m.deliverMerge(ctx, sess, task, project, prompt)
if err == nil {
return
}
slog.Error("start merge turn", "task", task.Id, "err", err)
m.failStart(ctx, sess.Id, "byre", err)
m.abandonMerge(task.Id, project.Id)
}
func (m *Manager) deliverMerge(ctx context.Context, sess api.AgentSession, task api.Task, project api.Project, prompt string) error {
l, err := m.ensureLive(ctx, sess, task)
if err != nil {
return err
}
err = m.syncModel(ctx, l, sess.Model)
if err != nil {
return err
}
_, err = m.prepareMessage(ctx, l, "byre", prompt, nil)
if err != nil {
return err
}
m.mu.Lock()
l.fetching = true
m.mu.Unlock()
err = git.FetchFastForward(ctx, project.RepoPath, project.DefaultBranch)
m.mu.Lock()
l.fetching = false
interrupted := l.interrupted
m.mu.Unlock()
if err != nil {
return err
}
if interrupted {
return errors.New("interrupted before the merge started")
}
return l.sess.send(ctx, prompt, nil)
}
func (m *Manager) recoverMerges(ctx context.Context) error {