Centralize snapshot review selection in the store

This commit is contained in:
Ian Gulliver
2026-10-21 12:25:32 -07:00
parent 44d75973a7
commit af4996c585
4 changed files with 14 additions and 20 deletions
+3 -3
View File
@@ -41,13 +41,13 @@ func (m *Manager) MergeAfterReview(ctx context.Context, task api.Task, user api.
if err != nil { if err != nil {
return api.Task{}, err return api.Task{}, err
} }
reviews, err := m.store.ListReviews(ctx, task.Id) reviews, err := m.store.SnapshotReviews(ctx, task.Id, latest.N)
if err != nil { if err != nil {
return api.Task{}, err return api.Task{}, err
} }
reviewID := "" reviewID := ""
for _, r := range reviews { for _, r := range reviews {
if r.SnapshotN == latest.N && r.State == api.ReviewStateRunning { if r.State == api.ReviewStateRunning {
reviewID = r.Id reviewID = r.Id
} }
} }
@@ -99,7 +99,7 @@ func (m *Manager) reviewFinished(reviewID string, deliver bool) {
if m.advanceReviews(ctx, r) { if m.advanceReviews(ctx, r) {
return return
} }
reviews, err := m.snapshotReviews(ctx, r.TaskId, r.SnapshotN) reviews, err := m.store.SnapshotReviews(ctx, r.TaskId, r.SnapshotN)
if err != nil { if err != nil {
slog.Error("list snapshot reviews", "task", r.TaskId, "err", err) slog.Error("list snapshot reviews", "task", r.TaskId, "err", err)
return return
+1 -1
View File
@@ -201,7 +201,7 @@ func (m *Manager) tryPromptReady(ctx context.Context, taskID string, fromReview
if err != nil { if err != nil {
return err return err
} }
reviews, err := m.snapshotReviews(ctx, taskID, latest.N) reviews, err := m.store.SnapshotReviews(ctx, taskID, latest.N)
if err != nil { if err != nil {
return err return err
} }
+2 -16
View File
@@ -164,20 +164,6 @@ func pendingReviewStages(def api.WorkflowDefinition, stage string, byStage map[s
return pending return pending
} }
func (m *Manager) snapshotReviews(ctx context.Context, taskID string, n int) ([]api.Review, error) {
reviews, err := m.store.ListReviews(ctx, taskID)
if err != nil {
return nil, err
}
out := []api.Review{}
for _, r := range reviews {
if r.SnapshotN == n {
out = append(out, r)
}
}
return out, nil
}
func (m *Manager) reviewDir(projectID, reviewID string) string { func (m *Manager) reviewDir(projectID, reviewID string) string {
return filepath.Join(m.worktreeRoot, projectID, "review-"+reviewID) return filepath.Join(m.worktreeRoot, projectID, "review-"+reviewID)
} }
@@ -596,13 +582,13 @@ func (m *Manager) respondToFindingTool(l *live) mcp.Tool {
if reason == "" { if reason == "" {
return "", fmt.Errorf("%w: reason must not be empty", ErrInvalid) return "", fmt.Errorf("%w: reason must not be empty", ErrInvalid)
} }
reviews, err := m.store.ListReviews(ctx, l.taskID) reviews, err := m.store.SnapshotReviews(ctx, l.taskID, args.Snapshot)
if err != nil { if err != nil {
return "", err return "", err
} }
reviewID := "" reviewID := ""
for _, r := range reviews { for _, r := range reviews {
if r.SnapshotN == args.Snapshot && r.Stage == args.Reviewer && r.State == api.ReviewStateDone { if r.Stage == args.Reviewer && r.State == api.ReviewStateDone {
reviewID = r.Id reviewID = r.Id
} }
} }
+8
View File
@@ -69,6 +69,14 @@ func (s *Store) ListReviews(ctx context.Context, taskID string) ([]api.Review, e
return scanReviews(rows) return scanReviews(rows)
} }
func (s *Store) SnapshotReviews(ctx context.Context, taskID string, n int) ([]api.Review, error) {
rows, err := s.db.QueryContext(ctx, `SELECT `+reviewColumns+` FROM reviews WHERE task_id = ? AND snapshot_n = ? ORDER BY created_at`, taskID, n)
if err != nil {
return nil, err
}
return scanReviews(rows)
}
func (s *Store) RunningReviews(ctx context.Context) ([]api.Review, error) { func (s *Store) RunningReviews(ctx context.Context) ([]api.Review, error) {
rows, err := s.db.QueryContext(ctx, `SELECT `+reviewColumns+` FROM reviews WHERE state = ? ORDER BY created_at`, string(api.ReviewStateRunning)) rows, err := s.db.QueryContext(ctx, `SELECT `+reviewColumns+` FROM reviews WHERE state = ? ORDER BY created_at`, string(api.ReviewStateRunning))
if err != nil { if err != nil {