Move lead delivery and the Merge & continue hold onto the coordinator

This commit is contained in:
Ian Gulliver
2026-10-21 13:59:37 -07:00
parent 1734057293
commit 5c50fa857f
16 changed files with 270 additions and 190 deletions
+8 -25
View File
@@ -63,7 +63,6 @@ type Manager struct {
startRefused map[string]bool
handoffModel map[string]string
mergeTurns map[string]mergeTurn
landing map[string]landing
deliverMu sync.Mutex
deliverLocks map[string]*sessionLock
@@ -168,7 +167,6 @@ func New(st *store.Store, worktreeRoot, leadRoot, handsRoot, codexHome, antigrav
startRefused: map[string]bool{},
handoffModel: map[string]string{},
mergeTurns: map[string]mergeTurn{},
landing: map[string]landing{},
signals: make(chan []api.Event, 1024),
snaps: map[string]*snapState{},
pokes: make(chan struct{}, 1),
@@ -475,8 +473,6 @@ func (m *Manager) Recover(ctx context.Context) error {
return err
}
go m.deliverAllLeads()
go m.deliverAllQueued(context.Background())
go m.coordinate()
m.poke()
m.MarkFacts(allTasks)
@@ -582,30 +578,15 @@ func (m *Manager) Usage(ctx context.Context) (Usage, error) {
}
func (m *Manager) turn(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID, client string, images []string) (api.AgentSession, error) {
err := m.startRunning(ctx, sess, task.Id, actor)
err := m.startRunning(ctx, sess, actor)
if err != nil {
return api.AgentSession{}, err
}
return m.launch(ctx, sess, task, actor, text, sendID, client, images)
}
func (m *Manager) startRunning(ctx context.Context, sess api.AgentSession, taskID, actor string) error {
held := fmt.Errorf("%w: held while this task merges and continues", ErrConflict)
if m.heldForLanding(taskID, sess.Id) {
return held
}
err := transition(ctx, m.store, sess.Id, api.AgentSessionStateIdle, api.AgentSessionStateRunning, actor)
if err != nil {
return err
}
if m.heldForLanding(taskID, sess.Id) {
err = transition(ctx, m.store, sess.Id, api.AgentSessionStateRunning, api.AgentSessionStateIdle, actor)
if err != nil {
return err
}
return held
}
return nil
func (m *Manager) startRunning(ctx context.Context, sess api.AgentSession, actor string) error {
return transition(ctx, m.store, sess.Id, api.AgentSessionStateIdle, api.AgentSessionStateRunning, actor)
}
func (m *Manager) launch(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID, client string, images []string) (api.AgentSession, error) {
@@ -1187,8 +1168,6 @@ func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error {
return m.reviewTurnEnded(ctx, l, res)
}
defer m.endLanding(l.taskID, l.id)
m.mu.Lock()
interrupted := l.interrupted
rateLimited := l.rateLimited
@@ -1206,7 +1185,11 @@ func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error {
if owner {
defer m.endMergeTurn(l.id, false)
}
if (owner || m.landingBy(l.taskID, l.id) != "") && !finished {
landingBy, err := m.store.LandingBy(ctx, l.taskID, l.id)
if err != nil {
return err
}
if (owner || landingBy != "") && !finished {
err := git.AbortMerge(l.dir)
if err != nil {
slog.Error("abort unfinished merge", "session", l.id, "err", err)