Run the merge queue on a state-driven coordinator

This commit is contained in:
Ian Gulliver
2026-10-21 11:28:07 -07:00
parent a971cce9d6
commit 7fbdf1669a
13 changed files with 509 additions and 561 deletions
+22 -18
View File
@@ -69,9 +69,13 @@ func isContinuation(actor, text string) bool {
func (m *Manager) continueFromHandoff(sessionID, handoff string) {
ctx := context.Background()
err := m.handoff(ctx, sessionID, handoff)
if err != nil {
slog.Error("continue from handoff", "session", sessionID, "err", err)
m.advanceSessionMergeClaim(ctx, sessionID)
if err == nil {
return
}
slog.Error("continue from handoff", "session", sessionID, "err", err)
err = m.store.TransitionSession(ctx, sessionID, api.AgentSessionStateRunning, api.AgentSessionStateIdle, "byre")
if err != nil && !errors.Is(err, store.ErrStateChanged) {
slog.Error("end failed handoff", "session", sessionID, "err", err)
}
}
@@ -95,28 +99,28 @@ func (m *Manager) handoff(ctx context.Context, sessionID, handoff string) error
return err
}
discard, err := m.store.GetDiscard(ctx, sess.TaskId)
if err != nil {
return err
if creator.GitName == "" || creator.GitEmail == "" {
return ErrNoGitIdentity
}
if discard.State != store.DiscardNone {
m.startDiscard(sess.TaskId)
return nil
}
err = transition(ctx, m.store, sess.Id, api.AgentSessionStateIdle, api.AgentSessionStateCompleted, "byre")
if err != nil {
return err
}
m.stopLive(sess.Id)
task, err := m.store.GetTask(ctx, sess.TaskId)
if err != nil {
return err
}
_, err = m.create(ctx, task, creator, sess.Member, handoffPreamble+handoff, model, "byre", "", "", nil)
if errors.Is(err, ErrConflict) {
next := sessionFor(task, creator, sess.Member, model)
next.State = api.AgentSessionStateRunning
err = m.store.ReplaceSession(ctx, sess.Id, next, task.ProjectId, "byre")
if errors.Is(err, store.ErrStateChanged) {
err = transition(ctx, m.store, sess.Id, api.AgentSessionStateRunning, api.AgentSessionStateIdle, "byre")
if err != nil {
return err
}
m.startDiscard(task.Id)
return nil
}
if err != nil {
return err
}
m.stopLive(sess.Id)
_, err = m.launch(ctx, next, task, "byre", handoffPreamble+handoff, "", "", nil)
return err
}