diff --git a/server/src/__tests__/agent-live-run-routes.test.ts b/server/src/__tests__/agent-live-run-routes.test.ts index c8243370023..2ac8658da59 100644 --- a/server/src/__tests__/agent-live-run-routes.test.ts +++ b/server/src/__tests__/agent-live-run-routes.test.ts @@ -343,4 +343,42 @@ describe("agent live run routes", () => { expect(res.body).toHaveLength(50); expect(mockHeartbeatService.buildRunOutputSilence).toHaveBeenCalledTimes(50); }); + + it("treats explicit zero live run limits as the capped default", async () => { + const rows = Array.from({ length: 75 }, (_, index) => ({ + id: `run-${index}`, + companyId: "company-1", + status: "running", + invocationSource: "on_demand", + triggerDetail: "manual", + startedAt: new Date("2026-04-10T09:30:00.000Z"), + finishedAt: null, + createdAt: new Date(`2026-04-10T09:${String(index % 60).padStart(2, "0")}:00.000Z`), + agentId: "agent-1", + agentName: "Builder", + adapterType: "codex_local", + logBytes: 0, + livenessState: "healthy", + livenessReason: null, + continuationAttempt: 0, + lastUsefulActionAt: null, + nextAction: null, + lastOutputAt: null, + lastOutputSeq: null, + lastOutputStream: null, + lastOutputBytes: 0, + processStartedAt: null, + issueId: "issue-1", + })); + const { db, limit } = createLiveRunsDbStub(rows); + + const res = await requestApp( + await createApp(db), + (baseUrl) => request(baseUrl).get("/api/companies/company-1/live-runs?limit=0&minCount=0"), + ); + + expect(res.status, JSON.stringify(res.body)).toBe(200); + expect(limit).toHaveBeenCalledWith(50); + expect(res.body).toHaveLength(50); + }); }); diff --git a/server/src/routes/agents.ts b/server/src/routes/agents.ts index 47d586687f5..6dde3e8706c 100644 --- a/server/src/routes/agents.ts +++ b/server/src/routes/agents.ts @@ -98,7 +98,8 @@ function readRunLogLimitBytes(value: unknown) { function readLiveRunsQueryInt(value: unknown, max: number, fallback = 0) { const parsed = Number(value); if (!Number.isFinite(parsed)) return fallback; - return Math.max(0, Math.min(max, Math.trunc(parsed))); + if (parsed <= 0) return fallback; + return Math.min(max, Math.trunc(parsed)); } export function agentRoutes( diff --git a/server/src/services/recovery/service.ts b/server/src/services/recovery/service.ts index 74ba45e19a0..966f92e3a73 100644 --- a/server/src/services/recovery/service.ts +++ b/server/src/services/recovery/service.ts @@ -194,8 +194,7 @@ function isSuccessfulInProgressContinuationRun(latestRun: LatestIssueRun) { function isProductiveContinuationRun(latestRun: LatestIssueRun) { return latestRun?.status === "succeeded" && - (latestRun.livenessState === "advanced" || - latestRun.livenessState === "completed" || + (latestRun.livenessState === "completed" || latestRun.livenessState === "blocked" || latestRun.livenessState === "needs_followup"); }