package agents import ( "context" "log/slog" ) const abandonedMergeText = "The Merge turn ended unfinished (interrupted, failed to start, or with no final message), so byre didn't squash or push the task. Merge again to retry." func (m *Manager) poke() { select { case m.pokes <- struct{}{}: default: } } func (m *Manager) coordinate() { started := map[string]bool{} for { select { case <-m.watchStop: return case <-m.pokes: m.coordinatePass(context.Background(), started) } } } func (m *Manager) coordinatePass(ctx context.Context, started map[string]bool) { work, err := m.store.Coordinate(ctx) if err != nil { slog.Error("coordinate", "err", err) return } for _, id := range work.AbandonedMerges { slog.Info("merge turn ended unfinished", "task", id) m.fileError(ctx, id, abandonedMergeText) m.deliverIdle(ctx, id) } for _, c := range work.StartMerges { m.startClaimedMerge(ctx, c) } for _, id := range work.StartDiscards { m.startDiscard(ctx, id) } current := map[string]bool{} once := func(key string, run func()) { current[key] = true if started[key] { return } started[key] = true go run() } for _, f := range work.FinalizeMerges { once("merge:"+f.Task.Id, func() { m.finalizeMerge(f) }) } for _, id := range work.FinishDiscards { once("discard:"+id, func() { m.finishDiscard(id) }) } for key := range started { if !current[key] { delete(started, key) } } }