package store import ( "context" "database/sql" ) type Work struct { AbandonedMerges []string StartMerges []ClaimedMerge FinalizeMerges []FinalizingMerge StartDiscards []string FinishDiscards []string EndReviewers []EndedReviewer StartReviews []SnapshotRef StartStages []StageStart SettleReviews []SnapshotRef ReadyPrompts []ReadyPrompt AdvanceStages []string LeadDeliveries []LeadDelivery QueuedDelivery []QueuedDelivery } func (s *Store) Coordinate(ctx context.Context) (Work, error) { work := Work{} err := s.write(ctx, func(tx *sql.Tx, emit emitFunc) error { var err error work.AbandonedMerges, err = abandonMerges(ctx, tx, emit) if err != nil { return err } err = claimHeldMerges(ctx, tx, emit) if err != nil { return err } work.StartMerges, err = startableMerges(ctx, tx) if err != nil { return err } work.FinalizeMerges, err = finalizingMerges(ctx, tx) if err != nil { return err } _, err = tx.ExecContext(ctx, `UPDATE tasks SET discard_state = 'closing' WHERE status = 'active' AND discard_state = 'running' AND NOT EXISTS (SELECT 1 FROM agent_sessions s WHERE s.id = tasks.discard_session AND s.state = 'running')`) if err != nil { return err } work.StartDiscards, err = queryIDs(ctx, tx, `SELECT id FROM tasks WHERE status = 'active' AND discard_state = 'held' AND NOT `+implementerRunning) if err != nil { return err } work.FinishDiscards, err = queryIDs(ctx, tx, `SELECT id FROM tasks WHERE status = 'active' AND discard_state = 'closing'`) if err != nil { return err } work.EndReviewers, err = endReviews(ctx, tx, emit) if err != nil { return err } work.StartReviews, err = startableReviews(ctx, tx) if err != nil { return err } work.StartStages, err = pendingStages(ctx, tx) if err != nil { return err } work.SettleReviews, err = settleReviews(ctx, tx, work.StartStages) if err != nil { return err } work.ReadyPrompts, err = readyPrompts(ctx, tx, emit) if err != nil { return err } work.AdvanceStages, err = finishedStages(ctx, tx) if err != nil { return err } work.LeadDeliveries, err = leadDeliveries(ctx, tx) if err != nil { return err } err = endLandings(ctx, tx) if err != nil { return err } work.QueuedDelivery, err = queuedDeliveries(ctx, tx) return err }) return work, err }