From 8eb5ff08c86b7744a0336796bf5cc68f5d54c0b8 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 29 May 2026 01:12:40 -0400 Subject: [PATCH] fix(agents): bound media duplicate guard age --- .../image-generation-task-status.test.ts | 28 +++++++++++++++++++ .../media-generation-task-status-shared.ts | 3 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/agents/image-generation-task-status.test.ts b/src/agents/image-generation-task-status.test.ts index 29f6c272189..3458a6ede5d 100644 --- a/src/agents/image-generation-task-status.test.ts +++ b/src/agents/image-generation-task-status.test.ts @@ -378,6 +378,34 @@ describe("image generation task status", () => { ).toBeUndefined(); }); + it("does not keep stale recent starts forever for non-finite maxAgeMs", () => { + const now = Date.now(); + recordRecentMediaGenerationTaskStartForSession({ + sessionKey: "agent:main", + taskKind: IMAGE_GENERATION_TASK_KIND, + sourcePrefix: "image_generate", + taskId: "task-stale", + runId: "run-stale", + taskLabel: "stale prompt", + requestKey: "image-request:stale", + providerId: "xai", + progressSummary: "Generating stale image", + nowMs: now - 1, + }); + + expect( + findRecentStartedMediaGenerationTaskForSession({ + sessionKey: "agent:main", + taskKind: IMAGE_GENERATION_TASK_KIND, + sourcePrefix: "image_generate", + taskLabel: "stale prompt", + requestKey: "image-request:stale", + maxAgeMs: Number.POSITIVE_INFINITY, + nowMs: now, + }), + ).toBeUndefined(); + }); + it("does not block a distinct prompt from a cached active recent start", () => { recordRecentMediaGenerationTaskStartForSession({ sessionKey: "agent:main", diff --git a/src/agents/media-generation-task-status-shared.ts b/src/agents/media-generation-task-status-shared.ts index c3fc0af8ea5..3deca5a20c6 100644 --- a/src/agents/media-generation-task-status-shared.ts +++ b/src/agents/media-generation-task-status-shared.ts @@ -1,3 +1,4 @@ +import { resolveNonNegativeIntegerOption } from "../shared/number-coercion.js"; import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, @@ -220,7 +221,7 @@ export function findRecentStartedMediaGenerationTaskForSession(params: { return undefined; } const nowMs = params.nowMs ?? Date.now(); - const maxAgeMs = Math.max(0, Math.floor(params.maxAgeMs)); + const maxAgeMs = resolveNonNegativeIntegerOption(params.maxAgeMs, 0); const taskLabel = normalizeOptionalString(params.taskLabel); pruneRecentMediaGenerationTaskStarts({ maxAgeMs, nowMs, preserveKey: key }); const entries = recentMediaGenerationTaskStarts.get(key);