From fc42bcaa290a1f089e8c3d41bde17f6977062936 Mon Sep 17 00:00:00 2001 From: mpcgird Date: Tue, 17 Feb 2026 02:15:35 +0200 Subject: [PATCH] Fix nextCursor for runs list pagination. --- .../runsRepository/clickhouseRunsRepository.server.ts | 6 +++++- .../runsRepository/postgresRunsRepository.server.ts | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts b/apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts index 9d3a92e9110..6758af79a67 100644 --- a/apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts +++ b/apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts @@ -101,7 +101,11 @@ export class ClickHouseRunsRepository implements IRunsRepository { previousCursor = reversedRunIds.at(1) ?? null; nextCursor = reversedRunIds.at(options.page.size) ?? null; } else { - nextCursor = reversedRunIds.at(options.page.size - 1) ?? null; + // Use the last item (oldest run) as the forward cursor. + // We can't use a fixed index (pageSize - 1) because the result set + // may have fewer items than pageSize (e.g., when new runs were created + // while the user was browsing, shifting page boundaries). + nextCursor = reversedRunIds.at(reversedRunIds.length - 1) ?? null; } break; diff --git a/apps/webapp/app/services/runsRepository/postgresRunsRepository.server.ts b/apps/webapp/app/services/runsRepository/postgresRunsRepository.server.ts index eaf22420901..6349aa11947 100644 --- a/apps/webapp/app/services/runsRepository/postgresRunsRepository.server.ts +++ b/apps/webapp/app/services/runsRepository/postgresRunsRepository.server.ts @@ -75,7 +75,11 @@ export class PostgresRunsRepository implements IRunsRepository { previousCursor = reversedRuns.at(1)?.id ?? null; nextCursor = reversedRuns.at(options.page.size)?.id ?? null; } else { - nextCursor = reversedRuns.at(options.page.size - 1)?.id ?? null; + // Use the last item (oldest run) as the forward cursor. + // We can't use a fixed index (pageSize - 1) because the result set + // may have fewer items than pageSize (e.g., when new runs were created + // while the user was browsing, shifting page boundaries). + nextCursor = reversedRuns.at(reversedRuns.length - 1)?.id ?? null; } break; }